2013-01-14 15 views
2

我的问题是,我有数据集有表,我想返回值数据集和查询与作为列表<int>

'where DocumentType IN (@list)' 

,但@list是这样的:

string.Join(",",DocTypes.List1); 

我曾尝试使用它像 SELECT........ WHERE DocumentType IN (@list)(在DataSet表适配器向导中),但是当执行Fill方法时,有安误差:

adapter1.Fill(ds.allDocuments, string.Join(",",DocTypes.List1); 

参数2应该是int,而不是字符串。 声明也不会在数据集中工作..

任何帮助吗?

+0

请在出现错误时始终添加异常和堆栈轨道,以便我们了解错误的性质。由于它是星期一,我会抑制自己的下调... – flq

回答

2

你需要一个Split功能,那么这个工程:

WHERE 
    ([DocumentType IN] IN 
     (SELECT Item 
     FROM dbo.Split(@list, ',') AS DocumentSplit)) 

这是一个可能实现的表值函数的:

CREATE FUNCTION [dbo].[Split] 
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @IDTable TABLE (Item VARCHAR(50)) 
AS  

BEGIN  
    DECLARE @tempItemList NVARCHAR(MAX) 
    SET @tempItemList = @ItemList 

    DECLARE @i INT  
    DECLARE @Item NVARCHAR(4000) 

    SET @tempItemList = REPLACE (@tempItemList, ' ', '') 
    SET @i = CHARINDEX(@delimiter, @tempItemList) 

    WHILE (LEN(@tempItemList) > 0) 
    BEGIN 
     IF @i = 0 
      SET @Item = @tempItemList 
     ELSE 
      SET @Item = LEFT(@tempItemList, @i - 1) 
     INSERT INTO @IDTable(Item) VALUES(@Item) 
     IF @i = 0 
      SET @tempItemList = '' 
     ELSE 
      SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 
     SET @i = CHARINDEX(@delimiter, @tempItemList) 
    END 
    RETURN 
END 

也许你需要手动确保参数这是DbType的表格适配器是字符串:

enter image description here

+0

OTOH,最适合的.NET DB提供程序在填写IN语句时是否支持列表作为参数类型? – flq

+0

@flq:不,没有提供者支持集合,因为数据库只能“理解”表。 http://www.sommarskog.se/arrays-in-sql-2008.html –

+0

是的,在该文本中有一个“从ADO.NET传递表值参数”块,听起来对我来说应该是可能的将某种集合类型的对象传递给参数。 – flq