其实这个牵涉到Asp.Net+C#,不知道的就帮忙顶顶吧。try
{
if (System.IO.File.Exists(uploadfile.Value.ToString()))
{
string [] filename=uploadfile.Value.ToString().Split(Convert.ToChar("."));
string filetype=filename[filename.Length-1];
if (filetype.ToUpper()!="XLS")
{
lbl_Message.Text="错误:只能录入数据源只能是XLS格式的文件!";
}
else
{
string strConnUpload = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + uploadfile.Value.ToString().Replace("\\", "\\\\") + ";Extended Properties=Excel 8.0";
OleDbConnection connUpload = new OleDbConnection(strConnUpload);
connUpload.Open(); string strSQL = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter daUpload = new OleDbDataAdapter(strSQL,connUpload); DataSet dsUpload = new DataSet(); daUpload.Fill(dsUpload,"[Sheet1$]"); string strConn="server="++";user="++";password="+;
OracleConnection conn = new OracleConnection(strConn);
conn.Open(); int iSuccess,iFail;
iSuccess=0;
iFail=0;
OracleCommand cmd = new OracleCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "p_henry_arr_process_input"; OracleParameter[] parameters = {
new OracleParameter("pv_AccNbr",OracleType.VarChar,21,ParameterDirection.Input,true,0,0,"",DataRowVersion.Default,Convert.DBNull),
new OracleParameter("pv_MonthTimes",OracleType.VarChar,8,ParameterDirection.Input,true,0,0,"",DataRowVersion.Default,Convert.DBNull),
new OracleParameter("pn_ReturnValue",OracleType.Number,1,ParameterDirection.Output,true,1,0,"",DataRowVersion.Default,Convert.DBNull)
};
for (int iRow=0;iRow<dsUpload.Tables["[Sheet1$]"].Rows.Count; iRow++)
{
parameters[0].Value=Convert.ToString(dsUpload.Tables["[Sheet1$]"].Rows[iRow][4]);
parameters[1].Value=Convert.ToString(dsUpload.Tables["[Sheet1$]"].Rows[iRow][9]);
cmd.Parameters.Clear();
foreach(OracleParameter parameter in parameters)
cmd.Parameters.Add( parameter );
cmd.ExecuteOracleScalar();
if(Convert.ToInt32(parameters[2].Value)!=0)
{
iSuccess++;
}
else
{
iFail++;
}
} lbl_Message.Text="成功"+iSuccess+"条,失败"+iFail+"条。"; conn.Close();
connUpload.Close();

lbl_Message.Text="录入成功!";
}
}
}
catch (Exception exc)
{
lbl_Message.Text="错误:录入失败!";
}上面是C#代码,选择一个EXCEL文件,让每行记录去和Oracle数据库中的匹配,如果不存在返回0。下面是存储过程create or replace procedure p_henry_arr_process_input(
pv_AccNbr in varchar2,
pv_MonthTimes in varchar2,
pn_ReturnValue out number) is
l_count number;
begin
  select count(*) into l_count from arr_process_test
  where acc_nbr=pv_AccNbr and month_times=pv_MonthTimes;
  pn_ReturnValue:=l_count;
end p_henry_arr_process_input;不知道哪里错了,总是提示录入失败。
从Excel中取数部分是没有问题的,我已经测试过可以取到数。

解决方案 »

  1.   

    可能不是数据库的原因呢,
    看看exception.message
      

  2.   

    建议同mittee(最后一条大白鲨[无限深情凝视花花版]) 
    查看exc.message
      

  3.   

    其实这个问题很简单,是我粗心,忘了cmd.Connection = conn;那我把这个分转到另一个问题上吧。Excel文件中,如果单元格格式是文本,我插入一个数的话在单元格的左上角会出现一个绿色的小角,那么当C#中读取文件时它会认为此单元格为null,请问这个问题怎么解决?
    文件很大,我不能一个一个的单元格去改格式,而且我必须保证格式是文本,批量修改格式无效。对了,这个问题只会出现在装了Offcie2003的机器上。2002以下版本都不存在。
      

  4.   

    for (int iRow=0;iRow<dsUpload.Tables["[Sheet1$]"].Rows.Count; iRow++)
    {
    parameters[0].Value=Convert.ToString(dsUpload.Tables["[Sheet1$]"].Rows[iRow][4]);
    parameters[1].Value=Convert.ToString(dsUpload.Tables["[Sheet1$]"].Rows[iRow][9]);
    cmd.Parameters.Clear();
    foreach(OracleParameter parameter in parameters)
    cmd.Parameters.Add( parameter );
    cmd.ExecuteOracleScalar();
    if(Convert.ToInt32(parameters[2].Value)!=0)
    {
    iSuccess++;
    }
    else
    {
    iFail++;
    }
    }
    这一段其实我觉得没必要把parameters.add在每个循环里再添加一次,clear掉了再添加一次这样效率比较低,完全可以在for外面添加。楼主能解释一下吗?
      

  5.   

    因为我要检查excel中的每一行记录和数据库中的是否匹配,如果条件符合的话就插入到数据库中。有可能800行的记录只有500行符合条件,我就只要插入这些符合的数据,所以我建了循环。
    Airblack(C#疯子) 你也真会开玩笑,当初我的确是没有发现漏了conn.open(),后来发现问题后才后悔用了这么多分提问,呵呵,所以分转移到了第二个问题上,第二个问题我一直没有解决,好象有点难度。
      

  6.   

    楼主应该单步debug可以测试出问题。
    前些天遇到过这个Excel问题,怀疑是Execel的问题,没有找到解决办法。找找有什么补丁