索引超出了范围.必须是非负的,并且小于收藏的大小.参数名称:索引-6

  • 本文关键字:索引 收藏 小于 参数 范围 是非 vb.net
  • 更新时间 :
  • 英文 :


我有SQL数据库表,并具有以下数据:

BillNo    Particular     Price     Unit       Amount     Taxamount     Tax
2905      Airfreight     100.000    100      10000.000     0.000      0.000
2905      Customs        4500.00    1         0.000       4500.000    675.000 
2906        THC          250.000    1         0.000       250.000     38.000
2906        XYZ          5000.00    1        5000.000       0.0000    0.0000

在窗口表单中,我有一个名为 Tbblbillto.Text的文本框,用于按帐单编号搜索,并且一个datagrid。当我在文本框中键入账单号时,如何将来自SQL表的数据进行过滤,然后将其放入DataGrid?

中?
*Data Grid Table*
**Particular     Price            Unit         Amount      Taxamount        Tax**
Private Sub Tbblbillto_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tbblbillto.TextChanged
       Dim Cmd As New SqlClient.SqlCommand
       Dim Con As New SqlClient.SqlConnection
       Dim Rd As SqlDataReader
       Con.ConnectionString = "Data Source=(localdb)MSSQLLocalDB;Initial Catalog=dbase;Integrated Security=True;Pooling=False"
       Cmd.Connection = Con
       Con.Open()
       Dim Row As New DataGridViewRow
       Dim Int As Integer
       Row = Dgvbillsa.Rows(Int)
       Cmd.CommandText = "Select * from BillDetails Where BillNo = '" & Tbblbillto.Text & "'"
       Rd = Cmd.ExecuteReader
       Rd.Read()
       If Rd.HasRows Then
           Row.Cells(0).Value = Rd.Item("Particular")
           Row.Cells(1).Value = Rd.Item("Price")
           Row.Cells(2).Value = Rd.Item("Unit")
           Row.Cells(3).Value = Rd.Item("Amount")
           Row.Cells(4).Value = Rd.Item("TaxAmount")
           Row.Cells(5).Value = Rd.Item("Tax")
       End If
   End Sub

您可以使用DataTable将数据直接加载到DataGridView中,或者至少这就是我这样做的方式。

执行SQL命令时,您应该使用参数。这是为了减少语法问题,但更重要的是阻止SQL注入。有关此的更多详细信息,请参见Bobby Tables。

我也将考虑使用以下方式实施:

有时您的代码需要一个非管理的资源,例如文件句柄,包装器或SQL连接。A使用块可以保证处理一个或多个此类资源后,当您的代码与它们完成时。这使它们可用于其他代码。

随着更改,您的代码看起来与此相似:

Dim dt As New DataTable
Using con As New SqlConnection("Data Source=(localdb)MSSQLLocalDB;Initial Catalog=dbase;Integrated Security=True;Pooling=False"),
      cmd As New SqlCommand("SELECT * FROM BillDetails WHERE BillNo = @BillNo", con)
    con.Open()
    cmd.Parameters.Add("@BillNo", SqlDbType.[Type]).Value = Tbblbillto.Text
    dt.Load(cmd.ExecuteReader())
End Using
Dgvbillsa.DataSource = dt

请注意,我已经使用了SqlDbType.[Type]。您将需要用您在数据库上使用的数据类型替换[Type]

这将把数据直接加载到您的DataGridView中。取决于DataGridView的设置您可能需要为列进行一些更改。

这是我问题的答案:

Cmd.CommandText = "Select Particular, Price, Unit, Amount, TaxAmount, Tax from BillDetails Where BillNo = '" & Tbblbillto.Text & "' GROUP BY [Particular], [Price], [Unit], [Amount], [TaxAmount], [Tax]"
Rd.Close()
Rd = Cmd.ExecuteReader
While Rd.Read() OrElse (Rd.NextResult())
    If Rd.HasRows Then
        Dgvbillsa.Rows.Add(Rd.Item("Particular"), Rd.Item("Price"), Rd.Item("Unit"), Rd.Item("Amount"), Rd.Item("TaxAmount"), Rd.Item("Tax"))

最新更新