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;