c# - 使用 .NET 中的类型化数据集将 SQL 参数传递给 IN() 子句

标签 c# sql parameter-passing strongly-typed-dataset

首先道歉,因为这个网站上有类似的问题,但没有人直接回答这个问题。

我在 VS 2010 中使用类型化数据集。我在数据集中创建一个 TableAdapter,查询如下:

SELECT * from Table WHERE ID IN(@IDs)

现在如果我调用:TableAdapter.Fill(MyDataTable,"1,2,3") 会发生错误,指出 VS 无法将 1,2,3 转换为 int 类型。很公平。

然后我决定将参数(即@IDs)类型更改为参数集合中的字符串。再试一次 - 仍然是相同的错误消息。

那么这个类型化的数据集有什么方法可以接受我的“1,2,3”参数吗?目前我只有几个参数要传递,所以我可以轻松地创建 5 个左右的参数并分别传递它们,但是如果有数百个怎么办?有什么方法可以用我的逗号分隔参数调用 Fill() 方法吗?

(我知道我可以使用动态 SQL 来创建语句并执行它,但如果有另一种方法允许我保留我的类型化数据集以供在 ReportViewer/bindingsources 中使用,我会更喜欢)

最佳答案

您不能以这种方式将单个参数用于值列表。但是可能有特定于数据库的方法来实现您想要的。例如,使用 SQL Server 2005 或更高版本,您可以创建一个表值函数来拆分字符串参数,例如:

CREATE FUNCTION dbo.F_Split
(
@InputString VARCHAR(MAX)
,@Separator VARCHAR(MAX)
)
RETURNS @ValueTable TABLE (Value VARCHAR(MAX))
AS
BEGIN

    DECLARE @SeparatorIndex INT, @TotalLength INT, @StartIndex INT, @Value VARCHAR(MAX)
    SET @TotalLength=LEN(@InputString)
    SET @StartIndex = 1

    IF @Separator IS NULL RETURN

    WHILE @StartIndex <= @TotalLength
    BEGIN
        SET @SeparatorIndex = CHARINDEX(@Separator, @InputString, @StartIndex)
        IF @SeparatorIndex > 0
        BEGIN
            SET @Value = SUBSTRING(@InputString, @StartIndex, @SeparatorIndex-@StartIndex)
            SET @StartIndex = @SeparatorIndex + 1
        END
        ELSE
        BEGIN
            Set @Value = SUBSTRING(@InputString, @StartIndex, @TotalLength-@StartIndex+1)
            SET @StartIndex = @TotalLength+1
        END
        INSERT INTO @ValueTable
        (Value)
        VALUES
        (@Value)
    END

    RETURN
END

然后您将按如下方式使用它:

SELECT * from Table WHERE ID IN (SELECT CAST(Value AS INT) FROM F_Split(@IDs, ','))

关于c# - 使用 .NET 中的类型化数据集将 SQL 参数传递给 IN() 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401641/

相关文章:

sql - SQLITE更新操作

c# - 尝试将 Gmap.Net 控件添加到工具箱

c# - 单点登录 - API 版本控制和共享数据传输对象

php - WordPress将重力形式数据插入新表中

c# - 使用参数化查询填充数据列表

c++ - 什么时候通过复制/引用?

c - C 中将数组和数组指针传递给函数的区别

c# - 响应式用户界面 6 : How can I achieve same functionality of version 4 in version 6

c# - 如何在JArray上做Top n?

sql - 通过 Alamofire 将数据加载到我的 swift 应用程序(我已经安装了它)