我正在尝试使用托管的 ODP.Net 和 Enterprise Library 一对一地执行多个(3)存储过程。每个存储过程都返回一个 OUT游标,每个游标都被命名为“ cur_out ”。奇怪的是,第一个存储过程总是返回记录,但是随后为其余两个SP调用ExecuteDataSet()却从不返回任何记录。这与System.Data.OracleClient完美配合,因此我知道存储过程本身没有问题。我无法弄清楚为什么这些SP不返回任何东西。下面是我的示例代码:
DbCommand cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP1");
DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM1", param1);
DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM2", param2);
if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
OracleParameter cur = new OracleParameter("cur_out",
OracleDbType.RefCursor, 0,
ParameterDirection.Output, true,
0, 0, String.Empty,
DataRowVersion.Current,
Convert.DBNull);
cmd.Parameters.Add(cur);
}
DataSet dsSub = DB.ExecuteDataSet(cmd); <--WORKS i.e. returns records
cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP2");
DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM1", param1);
DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM2", param2);
if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
OracleParameter cur = new OracleParameter("cur_out",
OracleDbType.RefCursor, 0,
ParameterDirection.Output, true,
0, 0, String.Empty,
DataRowVersion.Current,
Convert.DBNull);
cmd.Parameters.Add(cur);
}
DataSet dsSub1 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned
DataTable dt1 = dsSub1.Tables[0];
dsSub1.Tables.Remove(dt1);
dt1.TableName = "Ported DataTable 1";//Provide name
explicitly to prevent name conflicts with existing datatable
dsSub.Tables.Add(dt1);
cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP3");
DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM1", param1);
DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
DB.SetParameterValue(cmd, "PI_PARAM2", param2);
if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
{
OracleParameter cur = new OracleParameter("cur_out",
OracleDbType.RefCursor, 0,
ParameterDirection.Output, true,
0, 0, String.Empty,
DataRowVersion.Current,
Convert.DBNull);
cmd.Parameters.Add(cur);
}
DataSet dsSub2 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned
DataTable dt2 = dsSub2.Tables[0];
dsSub2.Tables.Remove(dt2);
dt2.TableName = "Ported DataTable 2";//Provide name
explicitly to prevent name conflicts with existing datatable
dsSub.Tables.Add(dt2);
有人可以指出我在这里想念什么吗?有什么我可以做的不同吗?请注意,我使用的是Oracle 12c DB,在单个存储过程中返回多个ref游标存在问题,因此必须分别执行这些游标,然后将结果合并到单个数据集中。
答案 0 :(得分:0)
我建议声明全新的DbCommand cmd2
和DbCommand cmd3
,而不要尝试重用初始的DbCommand cmd
。过去,在重用与Oracle参数和连接有关的变量时,我遇到了很多问题,如果仅对数据库连接的每个方面都使用新变量,那么很多问题就会消失。
对于您的代码,似乎您正在不断向cmd.
中添加相同的两个参数,但是我认为这并不是将现有参数中的值重新设置为新值。它将另一个重复的参数添加到参数集合中,这会导致问题。