我正在使用Oracle .NET Provider并在包中调用存储过程。我收到的消息是“电话号码错误或类型”。我已经确保添加参数的顺序是正确的顺序,我已经彻底检查了OracleDbType,尽管我怀疑这是我的问题所在。这是代码隐藏:
//设置初始内容,连接和命令 string msg = string.Empty; string oraConnString = ConfigurationManager.ConnectionStrings [“OracleServer”]。ConnectionString; OracleConnection oraConn = new OracleConnection(oraConnString); OracleCommand oraCmd =新的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;
答案 0 :(得分:1)
您指定的任何参数值实际上都是null
吗?我不太确定Oracle的情况,但是对于SQL Server,将null
分配给参数将导致在执行过程时不发送该参数(这将导致程序抱怨参数的数量) 。您应该通过DBNull.Value
而不是null
:
p1.Value = millCenter ?? DBNull.Value;
答案 1 :(得分:1)
我认为您的问题可能与您的第9个参数有关。如果这是存储过程的返回值,则返回类型应设置为ParameterDirection.ReturnValue
。
希望有所帮助。
答案 2 :(得分:0)
我基本上踩到了自己的脚趾......我在循环中设置参数,然后在每次迭代后不清除它们。我现在很好。