복붙노트

[SQL] IN () 절에 SQL 매개 변수를 전달하면 .NET에서 데이터 집합을 입력하여

SQL

IN () 절에 SQL 매개 변수를 전달하면 .NET에서 데이터 집합을 입력하여

먼저 사과는이 사이트에 비슷한 질문이 있기 때문에,하지만 그들 중 누구도 직접이 문제에 답하지 않습니다.

임 내가 쿼리 등으로 데이터 집합에 TableAdapter가를 만들 VS 2010 년 데이터 세트를 입력하여 :

SELECT * from Table WHERE ID IN(@IDs)

내가 전화를 이제 경우 : TableAdapter.Fill (MyDataTable, "1,2,3") 오류가 VS가 INT를 입력 1,2,3을 변환 할 수 없다는 발생합니다. 그럴 수 있지.

그럼 내가 매개 변수 컬렉션 문자열 (즉, @IDs) 유형의 매개 변수를 변경하기로 결정. 다시 시도 - 여전히 같은 오류 메시지가.

그래서이 형식화 된 데이터 집합 내 "1,2,3"매개 변수를 받아 들일 수있는 방법은 무엇입니까? 내가 쉽게 불과 5 또는 매개 변수 있도록를 작성하고 개별적으로 통과하지만, 수백 어떤이있는 경우 수 있도록 지금이 순간 난 단지, 전달하는 몇 가지 매개 변수가? 내 쉼표로 채우기 () 메소드는 매개 변수를 분리 호출 할 수있는 방법이 있습니까?

(내가 문을 작성하고 실행하는 동적 SQL을 사용할 수 있지만 내게는 예를 들어,의 ReportViewer에서 사용하기 위해 내 입력 된 데이터 집합을 유지 할 수 있도록 다른 방법이 있는지 선호 알고 / bindingsources)

해결법

  1. ==============================

    1.이 방법으로 값 목록에 대해 하나의 매개 변수를 사용할 수 없습니다. 그러나 당신이 원하는 것을 달성하기 위해 데이터베이스 고유의 방법이 될 수있다. 예를 들어, SQL 서버 2005 이상 당신은 당신의 문자열 매개 변수를 분할하기 위해 테이블 ​​반환 함수를 만들 수 있습니다, 같은 :

    이 방법으로 값 목록에 대해 하나의 매개 변수를 사용할 수 없습니다. 그러나 당신이 원하는 것을 달성하기 위해 데이터베이스 고유의 방법이 될 수있다. 예를 들어, SQL 서버 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, ','))
    
  2. ==============================

    2.나는 문자열을 사용하여에 대한 해결 방법은 SQL 방식의 개념을 "포함"시도 :

    나는 문자열을 사용하여에 대한 해결 방법은 SQL 방식의 개념을 "포함"시도 :

    귀하의 경우, SQL을 변경 -

    기발한:

    지다:

  3. ==============================

    3.SQL Server 2008에서는 테이블 반환 매개 변수라는 기능이 있습니다

    SQL Server 2008에서는 테이블 반환 매개 변수라는 기능이 있습니다

    당신이 필요 그래서

    우리가 우리 자신에 의해 그것을 해결하기 위해 필요 불행하게도 표 어댑터 디자이너는 SqlParameter.TypeName 인수를 지원하지 않습니다. 목표는 생성 된 TableAdapter에 클래스의 CommandCollection 속성을 수정하는 것입니다. 당신이 TableAdapter에 또는 예를 들어, 사용 반사 그것을 조정할하기를 도출해야 불행하게도,이 속성은, 보호됩니다. 여기서 파생 클래스의 예이다 :

        public class MyTableAdapter2 : MyTableAdapter
        {
            public MyTableAdapter2()
            {
                SqlCommand[] cmds = base.CommandCollection;
                // here, the IDS parameter is index 0 of command 1
                // you'll have to be more clever, but you get the idea
                cmds[1].Parameters[0].TypeName = "MyIntArray";
            }
        }
    

    그리고 이것은이 메서드를 호출 할 수있는 방법입니다 :

            MyTableAdapter t = new MyTableAdapter2();
    
            // create the TVP parameter, with one column. the name is irrelevant.
            DataTable tvp = new DataTable();
            tvp.Columns.Add();
    
            // add one row for each value
            DataRow row = tvp.NewRow();
            row[0] = 1;
            tvp.Rows.Add(row);
    
            row = tvp.NewRow();
            row[0] = 2;
            tvp.Rows.Add(row);
    
            row = tvp.NewRow();
            row[0] = 3;
            tvp.Rows.Add(row);
    
            t.Fill(new MyDataTable(), tvp);
    
  4. ==============================

    4.PostgreSQL의는 IN과 Npgsql 함께 사용할 수있는 배열의 개념을 가지고 있기 때문에, 필자가 아는 유일한 데이터베이스가 IN 절에서 .NET에서 매개 변수를 사용할 수 있습니다 PostgreSQL은 배열을 할 수 있습니다 (또는를 IEnumerable ) 매개 변수입니다.

    PostgreSQL의는 IN과 Npgsql 함께 사용할 수있는 배열의 개념을 가지고 있기 때문에, 필자가 아는 유일한 데이터베이스가 IN 절에서 .NET에서 매개 변수를 사용할 수 있습니다 PostgreSQL은 배열을 할 수 있습니다 (또는를 IEnumerable ) 매개 변수입니다.

    다른 데이터베이스를 사용하면 하나 구조는 SQL에, 또는 다음 0 또는-이상의 매개 변수로 변환을하고 그들에 작용하는 데이터베이스 프로 시저에 문자열을 전달합니다.

  5. ==============================

    5.@Joe는 권리입니다.

    @Joe는 권리입니다.

    또는 당신은 그렇게 foreach는 루프를 사용할 수 있습니다.

    뭔가 같은 :

       int[] arr = new int[3]; 
        arr[0] = "1";        
        arr[1] = "2";             
        arr[2] = "3";             
    
    foreach(vat data in arr)
    {
    
    //Do your Code here
    
    // 
    var MyDatatable = obj.GetDatabyID(data);
    
    TableAdapter.Fill(MyDataTable);
    
    }
    

    문안 인사

  6. ==============================

    6.또한 ID를 매개 변수의 목록을 만들 수 있습니다 그래서 대신 @IDs를 사용하면 사용 ID1 @, ID2 @, ID3 @ 등

    또한 ID를 매개 변수의 목록을 만들 수 있습니다 그래서 대신 @IDs를 사용하면 사용 ID1 @, ID2 @, ID3 @ 등

    var sql = "SELECT * from Table WHERE ID IN (" + getKeys(values.Count) + ")";
    

    그리고 getKeys는 (카운트) 같은 것을 할 :

    var result = string.Empty;
                for (int i = 0; i < count; i++)
                {
                    result += ", @ID" + i;
                }
                return string.IsNullOrEmpty(result) ? string.Empty : result.Substring(1);
    

    그리고 마지막으로, 매개 변수를 추가 :

    foreach (int i = 0; i < values.Count; i++)
                {
                    cmd.Parameters.Add(new SqlParameter("@ID" + i, SqlDbType.VarChar) { Value = values[i]});
                }
    
  7. ==============================

    7.또한 저장 프로 시저에 매개 변수 목록을 전달하기 위해 XML을 사용할 수 있습니다 :

    또한 저장 프로 시저에 매개 변수 목록을 전달하기 위해 XML을 사용할 수 있습니다 :

    1) Visual Studio에서 :

    새로운 TableAdapter에를 만들고 단일 레코드를 얻기 위해 형식화 된 데이터 집합을 만듭니다

    SELECT * FROM myTable WHERE (ID = @ID)
    

    2)에서 SQL 서버 관리자 :

    당신의 입력 데이터 세트와 같은 선택 필드가있는 저장 프로 시저를 만들기 :

    CREATE PROCEDURE [dbo].[usrsp_GetIds]
        @paramList xml = NULL
    AS
        SET NOCOUNT ON;
    
    /*
    Create a temp table to hold paramaters list.
    Parse XML string and insert each value into table.
    Param list contains: List of ID's
    */
    DECLARE @tblParams AS TABLE (ID INT)
    INSERT INTO @tblParams(ID) 
        SELECT 
            XmlValues.ID.value('.', 'INT')
        FROM 
            @paramList.nodes('/params/value') AS XmlValues(ID)
    
    /* 
    Select records that match ID's in param list:
    */
    SELECT * FROM myTable 
    WHERE 
        ID IN (
            SELECT ID FROM @tblParams
        )
    

    3) Visual Studio에서 :

    당신의 TableAdapter에에 새 쿼리를 추가, usrsp_GetIds 위에서 만든 저장 프로 시저를 선택하고 그것을 FillBy_Ids 이름을 지정합니다. 이 명령을 생성합니다 :

    TableAdapter.FillBy_Ids(@paramList)
    

    4) Visual Studio에서 :

    당신의 .NET 코드에서 XML을 문자열 배열을 변환하는 유틸리티 함수를 만들 :

        ''' <summary>
        ''' Converts an array of strings to XML values.
        ''' </summary>
        ''' <remarks>Used to pass parameter values to the data store.</remarks>
        Public Shared Function ConvertToXML(xmlRootName As String, values() As String) As String
            'Note: XML values must be HTML encoded.
            Dim sb As New StringBuilder
            sb.AppendFormat("<{0}>", HttpUtility.HtmlEncode(xmlRootName))
            For Each value As String In values
                sb.AppendLine()
                sb.Append(vbTab)
                sb.AppendFormat("<value>{0}</value>", HttpUtility.HtmlEncode(value))
            Next
            sb.AppendLine()
            sb.AppendFormat("</{0}>", xmlRootName)
            Return sb.ToString
        End Function
    

    사용 예 :

    매개 변수로 문자열 목록을 전달하여 강력한 형식의 기능을 사용하여 데이터 테이블을 채 웁니다

    'Create a list of record IDs to retrieve:
    Dim ids as New List(of String)
    ids.Add(1)
    ids.Add(2)
    ids.Add(3)
    
    'Convert the list of IDs to an XML string:
    Dim paramsXml As String = ConvertToXML("params", ids.ToArray)
    
    'Get the records using standard DataTable & TableAdapter methods:
    Using myDT As New MyDataTable
        Using myTA As New MyTableAdapter
    
            myTA.FillBy_Ids(myDT, paramsXml)
    
            For Each row In myDT
                'do stuff:
            Next
    
        End Using
    End Using
    
  8. ==============================

    8.나는 거짓에 ClearBeforeFill 속성을 설정하고, foreach 루프에서 TableAdapter가를 작성하여이 문제를 해결 할 수 있었다.

    나는 거짓에 ClearBeforeFill 속성을 설정하고, foreach 루프에서 TableAdapter가를 작성하여이 문제를 해결 할 수 있었다.

    List<string> aList = new List<string>();
    aList.Add("1");
    aList.Add("2");
    aList.Add("3");
    
    yourTableAdapter.ClearBeforeFill = true;
    yourTableAdapter.Fill(yourDataSet.yourTableName, ""); //clears table
    
    foreach (string a in aList)
    {
        yourTableAdapter.ClearBeforeFill = false;
        yourTableAdapter.Fill(yourDataSet.yourTableName, a);
    }
    yourTableAdapter.Dispose();
    
  9. from https://stackoverflow.com/questions/5401641/passing-a-sql-parameter-to-an-in-clause-using-typed-datasets-in-net by cc-by-sa and MIT license