C# 将参数传递给AS400中的存储过程以匹配keywork中的参数
我试图将参数作为字符串传递给存储过程,该字符串将匹配语法中的C# 将参数传递给AS400中的存储过程以匹配keywork中的参数,c#,sql,stored-procedures,ibm-midrange,C#,Sql,Stored Procedures,Ibm Midrange,我试图将参数作为字符串传递给存储过程,该字符串将匹配语法中的 我将参数定义为CHARACTER,如果我正在编写以下代码,它将正常工作: MPROMY IN ( '2','3' ) MPROMY是数据库表中的列 我试图用参数替换这些值: MPROMY IN ( PRIORDAYS ) PRIORDAYS是传入的参数 这是我的C语言代码: 我得到以下错误: 错误[42000][IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104-令牌1
我将参数定义为CHARACTER
,如果我正在编写以下代码,它将正常工作:
MPROMY IN ( '2','3' )
MPROMY
是数据库表中的列
我试图用参数替换这些值:
MPROMY IN ( PRIORDAYS )
PRIORDAYS
是传入的参数
这是我的C语言代码:
我得到以下错误:
错误[42000][IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104-令牌1无效。有效令牌:)
传递参数以使用in关键字的正确语法是什么?我就是这样做的。在我的情况下,我传递了一个门店编号(在生产时不会硬编码)
我创建命令。告诉帕姆斯。执行存储过程
using IBM.Data.DB2.iSeries;
//Create a command object
cmd.Transaction = trans;
cmd.CommandText = "libraryname.storedprocedurename";
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
模型中描述了ItemStoreNumber和ItemDesc
// Build the Stored Procedure Paramaters - Build Input Value
iDB2VarChar stNumber = "0001"; //Get from store later
iDB2Parameter parm = cmd.Parameters.Add("@ItemStoreNumber",
iDB2DbType.iDB2VarChar);
cmd.Parameters["@ItemStoreNumber"].Direction =
parameterDirection.Input;
cmd.Parameters["@ItemStoreNumber"].Value = stNumber;
DataTable dt = new DataTable();
iDB2DataAdapter da = new iDB2DataAdapter();
da.SelectCommand = cmd;
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
StoreItem storeitem = new StoreItem();
storeitem.ItemStoreNumber = (String)
row["RSTORE"].ToString();
storeitem.ItemDesc = (String) row["IDESC"].ToString();
storeitem.ItemUpc = (String)row["RUPC"].ToString();
storeitem.ItemUom = (String)row["ISUNIT"].ToString();
storeitem.ItemRpack = (String)row["RCPACK"].ToString();
storeitem.ItemRetailPrice =
Convert.ToDecimal(row["RCRETAILP"].ToString());
myStoreItems.Add(storeitem);
}
return myStoreItems;
您是否确认存储过程接受动态sql?因为否则你的工作将无法进行;此外,还应该将CALL SPORDCMP({0})替换为CALL SPORDCMP({0}),因为您已经在“in”变量上使用引号了。您希望in()子句检查两种可能性,但您只传递了一个值。单个值由八个字符长的整个字符串组成。如果需要两个值,则需要传递两个参数。或者,正如@jclozano所说,你需要构造一个“动态SQL”语句。你能给我举个例子吗?我根本不清楚该怎么做。请解释一下它是如何回答这个问题的?我想强调的是代码中IN参数的定义。在定义PARM之前,我很难将PARM传递到存储过程。IDB2参数parm=cmd.Parameters.Add(“@ItemStoreNumber”,iDB2DbType.IDB2 VARCHAR);cmd.Parameters[“@ItemStoreNumber”].Direction=parameterDirection.Input;
// Build the Stored Procedure Paramaters - Build Input Value
iDB2VarChar stNumber = "0001"; //Get from store later
iDB2Parameter parm = cmd.Parameters.Add("@ItemStoreNumber",
iDB2DbType.iDB2VarChar);
cmd.Parameters["@ItemStoreNumber"].Direction =
parameterDirection.Input;
cmd.Parameters["@ItemStoreNumber"].Value = stNumber;
DataTable dt = new DataTable();
iDB2DataAdapter da = new iDB2DataAdapter();
da.SelectCommand = cmd;
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
StoreItem storeitem = new StoreItem();
storeitem.ItemStoreNumber = (String)
row["RSTORE"].ToString();
storeitem.ItemDesc = (String) row["IDESC"].ToString();
storeitem.ItemUpc = (String)row["RUPC"].ToString();
storeitem.ItemUom = (String)row["ISUNIT"].ToString();
storeitem.ItemRpack = (String)row["RCPACK"].ToString();
storeitem.ItemRetailPrice =
Convert.ToDecimal(row["RCRETAILP"].ToString());
myStoreItems.Add(storeitem);
}
return myStoreItems;