【问题标题】:Using named parameters with MySQL .NET Provider在 MySQL .NET Provider 中使用命名参数
【发布时间】:2009-05-17 10:49:19
【问题描述】:

在 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() 但想使用命名参数,这可能吗?

附:我只使用纯文本语句,没有 sproc,所以这些都不会传递给 sproc(以防你认为这是不可能的,因为 sprocs 不接受数组)

【问题讨论】:

    标签: .net mysql


    【解决方案1】:

    这个问题在这里被问了很多次,我停下来数数。

    无论技术如何,答案总是相同的。您只需将尽可能多的参数添加到您的查询中,因为您计划拥有 IN“参数”。

    如果你想查询WHERE id IN (1, 2 ,3),你准备好的语句必须是这样的:

    SELECT * FROM mytable WHERE id IN (?, ?, ?)
    

    使用您认为合适的任何字符串构建工具来制作这样的 SQL 字符串。之后,将三个参数值添加到其中。

    将 SQL 代码与数据分开是准备好的语句的全部意义所在。逗号是 SQL 代码,你永远不会用单个参数将它们放入语句中,它们必须在 before 中。

    好的,另一种选择。制作一个单独的/临时表,将您的 ID 存储在其中并查询如下内容:

    SELECT
      * 
    FROM 
      mytable m
      INNER JOIN searchtable s ON m.id = s.id
    

    【讨论】:

      【解决方案2】:

      问题在于您不只传递一个参数。你想传递一组参数。据我所知,目前尚不支持此功能(没有用于数组或集合的 DbType)。所以你不能将多个值作为一个参数添加。

      由于(我假设)“ids”中的数字元素可能会有所不同,因此您需要更改命令字符串以具有正确数量的参数。可以使用一些循环来生成命令字符串并用它们各自的值填充参数。这基本上意味着您要为每个查询创建一个新命令。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-11
        • 2019-07-27
        • 2015-07-29
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        相关资源
        最近更新 更多