我在ODBC中将存储过程执行到DB2数据库时遇到问题,其中存储过程有多个输入和输出参数。如果我只在call语句中的输入参数中指定?如下所示,我得到“ SQL0440 - 使用指定参数找不到* N中的例行XXXXXXX 。”。我已将输出参数更改为“ ReturnValue ”或“ 输出 ”,结果相同
这是我的代码:
var paramList = new List<OdbcParameter>();
var param1 = new OdbcParameter("FldId", "SLPMEMST_MESLRY");
param1.OdbcType = OdbcType.Char;
param1.Direction = ParameterDirection.Input;
paramList.Add(param1);
var param2 = new OdbcParameter("ExtIndex",2346);
param2.OdbcType = OdbcType.Decimal;
param2.Direction = ParameterDirection.Input;
paramList.Add(param2);
var param3 = new OdbcParameter("LogCmt", "test here");
param3.Direction = ParameterDirection.Input;
param3.OdbcType = OdbcType.Char;
paramList.Add(param3);
var prmOut1 = new OdbcParameter("PlainText", OdbcType.Char, 32624);
prmOut1.Direction = ParameterDirection.InputOutput ;
var prmOut2 = new OdbcParameter("MsgId", OdbcType.Char, 7);
prmOut2.Direction = ParameterDirection.InputOutput;
var prmOut3 = new OdbcParameter("MsgText", OdbcType.Char, 80);
prmOut3.Direction = ParameterDirection.InputOutput;
var prmOut4 = new OdbcParameter("Errors", OdbcType.Char, 1);
prmOut4.Direction = ParameterDirection.InputOutput;
paramList.Add(prmOut1);
paramList.Add(prmOut2);
paramList.Add(prmOut3);
paramList.Add(prmOut4);
var sproc = "{? =call P_GetEncFld (?, ?, ?)}";
DAL.Common_AS400.RunNonQuery_Parameterized(sproc, paramList,CommonData.ConnectionStringCrypto);
public static void RunNonQuery_Parameterized(string SQLStatement, IEnumerable<OdbcParameter> parameters, string connectionString)
{
OdbcConnection oConn = new OdbcConnection(ConfigurationManager.ConnectionStrings[connectionString].ToString()) { ConnectionTimeout = 300 };
using (var oCmd = new OdbcCommand())
{
foreach (OdbcParameter param in parameters)
{
oCmd.Parameters.Add(param);
}
if (oConn.State != ConnectionState.Open) oConn.Open();
oCmd.CommandType = CommandType.Text;
oCmd.CommandText = SQLStatement;
oCmd.Connection = oConn;
oCmd.ExecuteNonQuery();
}
}
想法?
答案 0 :(得分:0)
这是因为您的代码定义了sproc,而sproc本身没有相同数量的参数。确保在代码中发送和识别相同数量的参数。 您填充数组paramList但不适当地声明调用。每个参数都需要一个“?”。
"{? =call P_GetEncFld (?, ?, ?, ?, ?, ?, ?)}"