将参数传递给 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 中的事件侦听器......它存在吗?