none
請教WHERE IN 如何使用參數 RRS feed

  • 問題

  • SELECT * FROM Products WHERE ProNo IN (1,3) 

    請問 IN 後面的值如何使用參數
    又參數要如何給值

    Dim cmd As New SqlCommand("SELECT * FROM Products WHERE ProNo IN (@ProNo)", cn)

    cmd.Parameters.Add("@ProNo", SqlDbType.Int)

    cmd.Parameters("@RoleNo").Value = 有二個以上的值不知要如何給

    請各位前輩賜教
    謝謝


    2010年3月23日 上午 03:11

解答

  • 如果In後面帶的數量不定, 可能要用迴圈來處理

    ex:

    Dim myConn As New OleDbConnection(strCon)
            Dim myPara As New ArrayList
            myPara.Add(10)
            myPara.Add(89)
            myPara.Add(124)
            Dim SqlCmd As String = "Select * From TestTable01 WHERE Seq IN ( "
            For i As Integer = 0 To myPara.Count - 1
                If i < myPara.Count - 1 Then
                    SqlCmd &= " @Para" & i.ToString() & " ,"
                Else
                    SqlCmd &= " @Para" & i.ToString()
                End If
            Next
            SqlCmd &= " )"
            Dim myOleDbCommand As New OleDbCommand(SqlCmd, myConn)
            Dim myParameters As OleDbParameterCollection = myOleDbCommand.Parameters
            If myOleDbCommand.Parameters IsNot Nothing Then
                myOleDbCommand.Parameters.Clear()
            End If
            For j As Integer = 0 To myPara.Count - 1
                myOleDbCommand.Parameters.AddWithValue("@Para" & j.ToString(), System.Convert.ToInt32(myPara.Item(j)))
            Next
            Dim myDataAdapter As New OleDbDataAdapter(myOleDbCommand)
            Dim myDataSet As New DataSet
            myDataAdapter.Fill(myDataSet, "TestTable01")
            DataGridView1.DataSource = myDataSet.Tables(0)


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已提議為解答 TerryChuang 2010年3月24日 上午 09:21
    • 已標示為解答 Lolota Lee 2010年3月30日 上午 05:35
    2010年3月23日 上午 04:34

所有回覆

  • 不能再加參數嗎?

    或是寫在StoredProcedure,帶字串參數進去,然後在Procedure內切成Table變數

    cmd.Parameters.Add("@ProNo", SqlDbType.VarChar)

    cmd.Parameters("@RoleNo").Value = "1,3"

    2010年3月23日 上午 03:28
  • 因為ProNo的資料型別是int

    所以無法接受字串

     

    2010年3月23日 上午 03:32
  • cmd.Parameters("@RoleNo").Value = 有二個以上的值不知要如何給

    上面這行打錯

    應該是 cmd.Parameters("@ProNo").Valu

    2010年3月23日 上午 03:34
  • 所以才說寫成StoredProcedure,然後在Procedure裡面處理,這樣就可以帶字串參數進去了

    還是你們有規定不能寫SP?

    不能寫SP的話,就多給個參數不就得了

    Dim cmd As New SqlCommand("SELECT * FROM Products WHERE ProNo IN (@ProNo1,@ProNo2)", cn)

    2010年3月23日 上午 03:45
  • 如果In後面帶的數量不定, 可能要用迴圈來處理

    ex:

    Dim myConn As New OleDbConnection(strCon)
            Dim myPara As New ArrayList
            myPara.Add(10)
            myPara.Add(89)
            myPara.Add(124)
            Dim SqlCmd As String = "Select * From TestTable01 WHERE Seq IN ( "
            For i As Integer = 0 To myPara.Count - 1
                If i < myPara.Count - 1 Then
                    SqlCmd &= " @Para" & i.ToString() & " ,"
                Else
                    SqlCmd &= " @Para" & i.ToString()
                End If
            Next
            SqlCmd &= " )"
            Dim myOleDbCommand As New OleDbCommand(SqlCmd, myConn)
            Dim myParameters As OleDbParameterCollection = myOleDbCommand.Parameters
            If myOleDbCommand.Parameters IsNot Nothing Then
                myOleDbCommand.Parameters.Clear()
            End If
            For j As Integer = 0 To myPara.Count - 1
                myOleDbCommand.Parameters.AddWithValue("@Para" & j.ToString(), System.Convert.ToInt32(myPara.Item(j)))
            Next
            Dim myDataAdapter As New OleDbDataAdapter(myOleDbCommand)
            Dim myDataSet As New DataSet
            myDataAdapter.Fill(myDataSet, "TestTable01")
            DataGridView1.DataSource = myDataSet.Tables(0)


    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已提議為解答 TerryChuang 2010年3月24日 上午 09:21
    • 已標示為解答 Lolota Lee 2010年3月30日 上午 05:35
    2010年3月23日 上午 04:34
  • 以下是之前PO的做法.

    例如我的查詢條件 有"Jeff","Jack","Jay","Jason",將這些條件個個分開放到一個String Arrary裡.

    SqlCommand cmd=new SqlComand(); //其它怎麼用Connection等,因為不是重點,所以帶過不寫

    cmd.CommandText="select * from testdb where testid in (";

    string strName="Jeff,Jack,Jay,Jason";//要用in查詢的資料

    string[] strQry=strName.Split(",".ToCharArray());//把它切到String Array裡去

    int intCount=0;

    foreach (string sq in strQry)

    {

    cmd.Parameters.Add("@TestID"+intCount, sq) //所以每次的變數都會不同

    cmd.CommandText+="@TestID"+intCount+",";

    intCount++;// 變數加1

    }

    cmd.CommandText=cmd.CommandText.Remove(cmd.CommandText.Length-1,1)+")"; //把最後一個逗號換為右括號.

    最後就會組出select * from testdb where testid in (@TestID0,@TestID1,@TestID2,@TestID3)

     

    全文可以參考 : SQL 語法用like %或in時,Parameters要怎麼用,才能避免SQL Injection的問題

    2010年3月24日 上午 10:18