在MySQL .NET提供程序中,您可以在语法中使用命名参数:
?parametername
现在,我正在尝试为将在'IN'列表中使用的参数创建一个命名参数,例如:
select * from mytable where id in (?ids)
如何使用命名参数,如果我使用varchar,它将在列表前后添加引号,即:
如果我使用varchar:
传递参数的值cmd.Parameters.Add("?ids", MySqlDbType.Varchar).Value = ids; // ids is a string which contains the ids separated by commas, e.g. 1, 2, 3 .. etc
查询将按如下方式执行:
select * from mytable where id in ('1, 2 ,3')
当然这会抛出错误,如何在不获取引号的情况下传递命名参数,这就是应该执行的方式:
select * from mytable where id in (1, 2 , 3)
这有什么解决方法吗?我目前正在使用String.Format()但是想使用一个命名参数,这有可能是怎么样的?
P.S。我只使用纯文本语句,没有sproc,所以这些都不会被传递给sproc(以防你认为这是不可能的,因为sprocs不接受数组)
答案 0 :(得分:3)
这里有很多次被问到我已停下来算了。
无论技术如何,它总是一样的答案。当您计划拥有IN“参数”时,您只需将参数添加到查询中。
如果要查询WHERE id IN (1, 2 ,3)
,您准备好的语句必须如下所示:
SELECT * FROM mytable WHERE id IN (?, ?, ?)
使用您认为合适的任何字符串构建工具来创建这样的SQL字符串。之后,将三个参数值添加到其中。
准备语句的重点在于将SQL代码与数据分开。逗号是SQL代码,您永远不会使用单个参数将它们放入语句中,它们必须位于之前。
好的,是的另一种选择。创建一个单独的/临时表,将您的ID存储在其中并查询如下内容:
SELECT
*
FROM
mytable m
INNER JOIN searchtable s ON m.id = s.id
答案 1 :(得分:1)
问题是你没有传递一个参数。你想通过一组参数。据我所知,目前还没有支持(数组或集合没有DbType)。因此,您无法将多个值添加为一个参数。
由于(我假设)'ids'中的数字元素可能不同,您需要更改命令字符串以获得适当数量的参数。可以使用一些循环来生成命令字符串并用它们各自的值填充参数。这基本上意味着您要为每个查询创建一个新命令。
另一个解决方案是使用一个存储过程,该过程采用逗号分隔列表并使用它来构建查询。