如何为SQL参数提供List <int>?</int>

时间:2012-07-16 16:10:08

标签: c# sql winforms

我有一个如下的SQL语句:

...
const string sql = @"UPDATE PLATYPUS
SET DUCKBILLID = :NEWDUCKBILLID
WHERE PLATYPUSID IN (:ListOfInts)";
...
ocmd.Parameters.Add("ListOfInts", ??WhatNow??);

如何提供逗号分隔的整数列表,可以是任何(合理的*)数量的值

  • 在这种情况下,“合理”是指一到十几个。

6 个答案:

答案 0 :(得分:12)

你不能,你必须创建一些帮助函数,用(例如):ListOfInts替换:I0,:I1,:I2...并通过在代码中逐个添加来传递参数。您想要的功能由Dapper.Net中的its list support优雅地模拟。

答案 1 :(得分:5)

我认为唯一可行的解​​决方案是传递逗号分隔值,您可以使用函数将其转换为SQL中的表。这是我正在使用的功能

CREATE FUNCTION dbo.CSVToList (@CSV varchar(3000)) 
    RETURNS @Result TABLE (Value varchar(30))
AS   
BEGIN
    DECLARE @List TABLE
    (
        Value varchar(30)
    )

    DECLARE
        @Value varchar(30),
        @Pos int

    SET @CSV = LTRIM(RTRIM(@CSV))+ ','
    SET @Pos = CHARINDEX(',', @CSV, 1)

    IF REPLACE(@CSV, ',', '') <> ''
    BEGIN
        WHILE @Pos > 0
        BEGIN
            SET @Value = LTRIM(RTRIM(LEFT(@CSV, @Pos - 1)))

            IF @Value <> ''
                INSERT INTO @List (Value) VALUES (@Value) 

            SET @CSV = RIGHT(@CSV, LEN(@CSV) - @Pos)
            SET @Pos = CHARINDEX(',', @CSV, 1)
        END
    END     

    INSERT @Result
    SELECT
        Value
    FROM
        @List

    RETURN
END

您可以使用以下代码(例如)执行操作:

DECLARE @CSV varchar(100)
SET @CSV = '30,32,34,36,40'

SELECT 
    ProductID, 
    ProductName, 
    UnitPrice
FROM 
    Products
WHERE
    ProductID IN (SELECT * FROM dbo.CSVToLIst(@CSV))

我从这里获取了代码:http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm

希望它有所帮助。

答案 2 :(得分:4)

您没有说明您正在使用哪个数据库,但如果它是SQL Server 2008+,您可能还需要考虑Table Valued Parameters

对于您的示例,增加的复杂性可能不值得,但它们在其他场景中非常有用。

答案 3 :(得分:1)

在Ints阵列上使用Join string方法。您可以提及comma作为分隔符

List<int> ints = new List<int>();
ints.Add(4);
ints.Add(6);
ints.Add(2);

string concatenatedIds= string.Join(",", ints.ToArray());

输出(concatenatedIds中的值)将为4,6,2。您可以将该字符串用作IN子句

的参数值
ocmd.Parameters.Add("ListOfInts",concatenatedIds);

答案 4 :(得分:1)

处理此问题的最佳方法是将列表保留在数据库中,以便您可以编写选择查询以返回列表中的值。问题是,当数据来自客户端时,如何做到这一点?大多数情况下,这些数据是由用户亲自挑选的,一次一条记录。在这种情况下,您可以使用一个表(思考:“购物车”),在用户选择它们时,一次添加一个值的记录。如果它更像是批处理作业,您可能希望使用BulkInsert过程来创建记录。

答案 5 :(得分:0)

更新:正如Lasse指出的那样,使用下面的方法无法实现Clay尝试做的事情。虽然这确实传递了一个逗号分隔的数字列表,但它不会按预期执行。不幸的是我不能删除它,因为它是公认的答案。


尝试这样的事情:

ocmd.Parameters.Add("ListOfInts", String.Join(",",myList.ToArray());

String.Join方法获取数组中的所有元素,并将指定的字符放在它们之间。

相关问题