将参数传递给 AS400 中的存储过程以匹配 IN 键

Posted

技术标签:

【中文标题】将参数传递给 AS400 中的存储过程以匹配 IN 键【英文标题】:Pass a parameter to a stored procedure in AS400 to match IN keywork 【发布时间】:2016-03-16 16:05:04 【问题描述】:

我试图将参数作为字符串传递给存储过程,该字符串将匹配IN 语法。

我将参数定义为CHARACTER,如果我正在编写以下内容,它可以工作:

MPROMY IN ( '2','3' ) 

MPROMY是数据库表中的列。

我正在尝试用参数替换值:

MPROMY IN ( PRIORDAYS )

PRIORDAYS是传入的参数。

这是我的 C# 代码:

var daysIn = "'2','3'";
return CallStoredProcedure(string.Format("CALL SPORDCMP('0')", daysIn));

我收到以下错误:

错误 [42000] [IBM][System i Access ODBC 驱动程序][DB2 for i5/OS]SQL0104 - 令牌 1 无效。有效标记:) ,.

传递参数以使用 IN 关键字的正确语法是什么?

【问题讨论】:

你确认你的存储过程接受动态sql了吗?因为否则你的 in 将不起作用;你也应该用 CALL SPORDCMP(0) 替换 CALL SPORDCMP('0') 因为你已经在你的“in”变量上使用了引号 您希望您的 IN() 子句检查两种可能性,但您只传入一个值。单个值由整个字符串"'2','3'" 组成,它有八个字符长。如果你想要两个值,你需要传递两个参数。或者,正如@jclozano 所说,您需要构建一个“动态 SQL”语句。 你能给我举个例子吗,我完全不清楚该怎么做。 【参考方案1】:

我就是这样做的。在我的情况下,我传递了一个商店编号(在生产时不会被硬编码)。

我构建命令。告诉它参数。执行存储过程。

                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;

【讨论】:

请解释一下它是如何回答这个问题的? 我试图强调的是我的代码中 IN 参数的定义。在定义它们之前,我无法将参数传递给我的存储过程。 iDB2Parameter parm = cmd.Parameters.Add("@ItemStoreNumber", iDB2DbType.iDB2VarChar); cmd.Parameters["@ItemStoreNumber"].Direction = parameterDirection.Input;

以上是关于将参数传递给 AS400 中的存储过程以匹配 IN 键的主要内容,如果未能解决你的问题,请参考以下文章

以简单的方式将参数传递给 AS3 中的事件侦听器......它存在吗?

将参数传递给C#中的存储过程

将参数传递给c#中的sql存储过程

将参数传递给C#中的存储过程

将 xml 作为参数传递给 SQL Server 中的存储过程

当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?