.NET Oracle Provider:为啥我的存储过程不起作用?
Posted
技术标签:
【中文标题】.NET Oracle Provider:为啥我的存储过程不起作用?【英文标题】:.NET Oracle Provider: Why will my stored proc not work?.NET Oracle Provider:为什么我的存储过程不起作用? 【发布时间】:2011-01-30 21:35:33 【问题描述】:我正在使用 Oracle .NET Provider 并正在调用包中的存储过程。我收到的消息是“电话号码或类型错误”。我确保添加参数的顺序是正确的,并且我已经彻底检查了 OracleDbType,尽管我怀疑这是我的问题所在。这是代码隐藏:
//设置初始的东西,连接和命令 字符串味精=字符串。空; 字符串 oraConnString = ConfigurationManager.ConnectionStrings["OracleServer"].ConnectionString; OracleConnection oraConn = new OracleConnection(oraConnString); OracleCommand oraCmd = new OracleCommand("PK_MOVEMENT.INSERT_REC", oraConn); oraCmd.CommandType = CommandType.StoredProcedure;
try
//iterate the array
//grab 3 items at a time and do db insert, continue until all items are gone. Will always be divisible by 3.
for (int i = 0; i < theData.Length; i += 3)
//3 items hardcoded for now
string millCenter = "0010260510";
string movementType = "RECEIPT";
string feedCode = null;
string userID = "GRIMMETTM";
string inventoryType = "INGREDIENT"; //set to FINISHED for feed stuff
string movementDate = theData[i + 0];
string ingCode = System.Text.RegularExpressions.Regex.Match(theData[i + 1], @"^([0-9]*)").ToString();
string pounds = theData[i + 2].Replace(",", "");
//setup parameters
OracleParameter p1 = new OracleParameter("A_MILL_CENTER", OracleDbType.NVarchar2, 10);
p1.Direction = ParameterDirection.Input;
p1.Value = millCenter;
oraCmd.Parameters.Add(p1);
OracleParameter p2 = new OracleParameter("A_INGREDIENT_CODE", OracleDbType.NVarchar2, 50);
p2.Direction = ParameterDirection.Input;
p2.Value = ingCode;
oraCmd.Parameters.Add(p2);
OracleParameter p3 = new OracleParameter("A_FEED_CODE", OracleDbType.NVarchar2, 30);
p3.Direction = ParameterDirection.Input;
p3.Value = feedCode;
oraCmd.Parameters.Add(p3);
OracleParameter p4 = new OracleParameter("A_MOVEMENT_TYPE", OracleDbType.NVarchar2, 10);
p4.Direction = ParameterDirection.Input;
p4.Value = movementType;
oraCmd.Parameters.Add(p4);
OracleParameter p5 = new OracleParameter("A_MOVEMENT_DATE", OracleDbType.NVarchar2, 10);
p5.Direction = ParameterDirection.Input;
p5.Value = movementDate;
oraCmd.Parameters.Add(p5);
OracleParameter p6 = new OracleParameter("A_MOVEMENT_QTY", OracleDbType.Int64, 12);
p6.Direction = ParameterDirection.Input;
p6.Value = pounds;
oraCmd.Parameters.Add(p6);
OracleParameter p7 = new OracleParameter("INVENTORY_TYPE", OracleDbType.NVarchar2, 10);
p7.Direction = ParameterDirection.Input;
p7.Value = inventoryType;
oraCmd.Parameters.Add(p7);
OracleParameter p8 = new OracleParameter("A_CREATE_USERID", OracleDbType.NVarchar2, 20);
p8.Direction = ParameterDirection.Input;
p8.Value = userID;
oraCmd.Parameters.Add(p8);
OracleParameter p9 = new OracleParameter("A_RETURN_VALUE", OracleDbType.Int32, 10);
p9.Direction = ParameterDirection.Output;
oraCmd.Parameters.Add(p9);
//open and execute
oraConn.Open();
oraCmd.ExecuteNonQuery();
oraConn.Close();
catch (OracleException oraEx)
msg = "An error has occured in the database: " + oraEx.ToString();
catch (Exception ex)
msg = "An error has occured: " + ex.ToString();
finally
//close connection
oraConn.Close();
return msg;
【问题讨论】:
“磅”(p6) 真的是 Int64 吗?这是巨大的,但它应该仍然有效。你能出示程序的签名吗? 你也可以发布存储过程的声明吗? 即使我将 feedcode 设置为不等于 null,我也会得到这个。 【参考方案1】:会不会是您分配的任何参数值实际上是null
?我不太确定Oracle的情况,但是对于SQL Server,将null
分配给一个参数将导致执行过程时不发送该参数(这将导致过程抱怨参数数量)。而不是null
,你应该传递DBNull.Value
:
p1.Value = millCenter ?? DBNull.Value;
【讨论】:
好点,让它总是通过全套参数+1【参考方案2】:我认为您的问题可能与您的第 9 个参数有关。如果这是存储过程的返回值,则返回类型应设置为ParameterDirection.ReturnValue
。
希望对您有所帮助。
【讨论】:
【参考方案3】:我基本上在这里踩到了自己的脚趾...我在循环中设置参数,然后在每次迭代后不清除它们。我现在很好。
【讨论】:
以上是关于.NET Oracle Provider:为啥我的存储过程不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥.net网站访问出错 provider: TCP 提供程序, error: 0 -
为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用
Oracle数据库连接中Provider=OraOleDb.Oracle.1与Provider=MSDAORA啥区别?
Flutter Provider:为啥在调用 Provider.of<Widget>(context) 时会出现此错误,如 tihis: