簡體   English   中英

建立搜尋字串的SQL查詢

[英]Building SQL query for search string

我在創建用於在數據網格視圖中顯示項目的搜索查詢時遇到了一些麻煩,出現的錯誤是“索引超出范圍。必須為非負數並且小於集合的大小。參數名稱:index”

下面是我的代碼:

Try
    connect()
    Dim sql = "SELECT pcb, component, hour, faultcode, line FROM [sqlcnvfaultentry] WHERE "

    If CheckBox_pcb.Checked Then
        Sql = Sql & " and pcb = @pcb "
        cmd.Parameters.AddWithValue("@pcb", ComboBox_pcb.Text)
    End If

    If CheckBox_part.Checked Then
        Sql = Sql & " and component = @component "
        cmd.Parameters.AddWithValue("@component", ComboBox_part.Text)
    End If

    If CheckBox_hour.Checked Then
        Sql = Sql & " and hour = @hour "
        cmd.Parameters.AddWithValue("@hour", ComboBox_hour.Text)
    End If

    If CheckBox_fault.Checked Then
        Sql = Sql & " and faultcode = @faultcode "
        cmd.Parameters.AddWithValue("@faultcode", ComboBox_fault.Text)
    End If

    If CheckBox_line.Checked Then
        Sql = Sql & " and line = @line "
        cmd.Parameters.AddWithValue("@line", ComboBox_line.Text)
    End If

    Dim adapter = New SqlDataAdapter(cmd.CommandText, con.ConnectionString)
    Dim dt As New DataTable()

    cmd.CommandText = Sql
    adapter.Fill(dt)
    DataGridView_c1.DataSource = dt
    DataGridView_c1.Refresh()

    DataGridView_c1.Columns(0).HeaderText = "PCB:"
    DataGridView_c1.Columns(1).HeaderText = "Component:"
    DataGridView_c1.Columns(2).HeaderText = "Hour:"
    DataGridView_c1.Columns(3).HeaderText = "Fault Code:"
    DataGridView_c1.Columns(4).HeaderText = "Line:"

    disconnect()

Catch exp As Exception
    Throw exp
Finally

End Try

任何幫助都會很棒。

好吧,看來您的TSQL將永遠無效。 您先啟動一個具有SELECT... WHERE值的SELECT... WHERE ,然后開始向其附加以AND開頭的所有內容。 要解決此問題,您可以將語句開頭為SELECT... WHERE 1=1 ,然后開始將AND語句追加到WHERE子句中,就可以了。

就是說,我不太喜歡這種用於構建SQL語句的方法,而寧願看到適當的存儲過程。

現在,關於您的實際錯誤:由於您的TSQL語句無效,因此您的結果沒有任何列,並且這部分代碼...

DataGridView_c1.Columns(0).HeaderText = "PCB:"
DataGridView_c1.Columns(1).HeaderText = "Component:"
DataGridView_c1.Columns(2).HeaderText = "Hour:"
DataGridView_c1.Columns(3).HeaderText = "Fault Code:"
DataGridView_c1.Columns(4).HeaderText = "Line:"

...超出范圍,因為由於無效的SELECT語句而沒有記錄集。

在將其傳遞給SqlDataAdapter之后設置SqlCommand.CommandText不會更改存儲在適配器中的文本,在創建適配器之前將SqlCommand.Commandtext的設置移動似乎是一個很好的解決方法。

cmd.CommandText = Sql
Dim adapter = New SqlDataAdapter(cmd.CommandText, con.ConnectionString)
Dim dt As New DataTable()
adapter.Fill(dt)

但是,等等,您仍然有問題。 當您將字符串(作為CommandText)傳遞給適配器構造函數時,它將在內部使用該字符串構建另一個SqlCommand。 此內部命令的“參數”集合為空。 它對您的代碼在外部創建的參數集合一無所知。
因此,真正的解決方法是直接使用代碼准備的SqlCommand創建適配器。

cmd.CommandText = Sql
cmd.Connection = con

' Pass the SqlCommand, it will be used to be the SelectCommand of the adapter'
Dim adapter = New SqlDataAdapter(cmd)
Dim dt As New DataTable()
' Run the SelectCommand'
adapter.Fill(dt)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM