首先道歉,因为这个网站上有类似的问题,但没有人直接回答这个问题。
我在 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/