[英]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.