在MySQL .NET Provider中使用命名参数

时间:2009-05-17 10:49:19

标签: .net mysql

在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不接受数组)

2 个答案:

答案 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'中的数字元素可能不同,您需要更改命令字符串以获得适当数量的参数。可以使用一些循环来生成命令字符串并用它们各自的值填充参数。这基本上意味着您要为每个查询创建一个新命令。

另一个解决方案是使用一个存储过程,该过程采用逗号分隔列表并使用它来构建查询。