如何循环调用带返回值的存储过程。

时间:2021-03-07 21:15:38
其实这个牵涉到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中取数部分是没有问题的,我已经测试过可以取到数。

15 个解决方案

#1


呵呵,对oracle不熟悉,顶一下

#2


up

#3


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

#4


出血本放分,没有知心人呀!

#5


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

#6


UP

#7


其实这个问题很简单,是我粗心,忘了cmd.Connection = conn;

那我把这个分转到另一个问题上吧。

Excel文件中,如果单元格格式是文本,我插入一个数的话在单元格的左上角会出现一个绿色的小角,那么当C#中读取文件时它会认为此单元格为null,请问这个问题怎么解决?
文件很大,我不能一个一个的单元格去改格式,而且我必须保证格式是文本,批量修改格式无效。

对了,这个问题只会出现在装了Offcie2003的机器上。2002以下版本都不存在。

#8


楼主不是在耍我们吗,晕倒,不过也算学到点东西,呵呵

#9


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外面添加。楼主能解释一下吗?

#10


因为我要检查excel中的每一行记录和数据库中的是否匹配,如果条件符合的话就插入到数据库中。

有可能800行的记录只有500行符合条件,我就只要插入这些符合的数据,所以我建了循环。




Airblack(C#疯子) 你也真会开玩笑,当初我的确是没有发现漏了conn.open(),后来发现问题后才后悔用了这么多分提问,呵呵,所以分转移到了第二个问题上,第二个问题我一直没有解决,好象有点难度。

#11


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

#12


谢谢

#13


沉了

#14


你把错误信息显示出来,一看就知道哪错了.你现在自定义错误不好判断.

#15


结了算了

#1


呵呵,对oracle不熟悉,顶一下

#2


up

#3


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

#4


出血本放分,没有知心人呀!

#5


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

#6


UP

#7


其实这个问题很简单,是我粗心,忘了cmd.Connection = conn;

那我把这个分转到另一个问题上吧。

Excel文件中,如果单元格格式是文本,我插入一个数的话在单元格的左上角会出现一个绿色的小角,那么当C#中读取文件时它会认为此单元格为null,请问这个问题怎么解决?
文件很大,我不能一个一个的单元格去改格式,而且我必须保证格式是文本,批量修改格式无效。

对了,这个问题只会出现在装了Offcie2003的机器上。2002以下版本都不存在。

#8


楼主不是在耍我们吗,晕倒,不过也算学到点东西,呵呵

#9


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外面添加。楼主能解释一下吗?

#10


因为我要检查excel中的每一行记录和数据库中的是否匹配,如果条件符合的话就插入到数据库中。

有可能800行的记录只有500行符合条件,我就只要插入这些符合的数据,所以我建了循环。




Airblack(C#疯子) 你也真会开玩笑,当初我的确是没有发现漏了conn.open(),后来发现问题后才后悔用了这么多分提问,呵呵,所以分转移到了第二个问题上,第二个问题我一直没有解决,好象有点难度。

#11


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

#12


谢谢

#13


沉了

#14


你把错误信息显示出来,一看就知道哪错了.你现在自定义错误不好判断.

#15


结了算了