2017-05-31 7 views
1

私は、次のデータをSQLデータベースのテーブルを持っている:私は、請求書番号、およびデータグリッドで検索するためのTbblbillto.Textという名前のテキストボックスを持っているウィンドウの形でインデックスが範囲外です。負でなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス-6

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 

。請求書番号をテキストボックスに入力すると、SQLテーブルのデータを請求番号に対してフィルタリングしてデータグリッドに入れる方法を教えてください。

*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 
+2

私の私の、すべてのSQLインジェクションの脆弱性を見てください。 – Will

+0

私はあなたのポイントを理解していません –

+0

ユーザーが '';テーブルBillDetails - 'をテキストボックスにドロップしますか? –

答えて

1

あなたはまっすぐDataTableを使用してDataGridViewにデータをロードすることができ、あるいは少なくともこれは、私はそれを行うだろうかです。

ただし、SQLコマンドを実行するときはパラメータを使用する必要があります。これは構文の問題を減らすためですが、もっと重要なことにSQLインジェクションを停止します。詳細については、Bobby Tablesを参照してください。

私もUsingの実装を検討します:

時々、あなたのコードは、このようなファイルハンドル、COMラッパー、またはSQL接続などの管理対象外のリソースが必要です。 Usingブロックは、コードが終了したときにそのようなリソースを1つ以上廃棄することを保証します。これにより、他のコードを使用できるようになります。私はSqlDbType.[Type]を使用している

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 

注:あなたのコードは、これに似た何かを見てしまうの変更により

[Type]をデータベースで使用したデータ型に置き換えることをお勧めします。

これにより、データが直接DataGridViewにロードされます。 DataGridViewの 設定に応じて、列を少し変更する必要があります。ここで

0

は私の質問のための答えです:

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")) 
関連する問題

 関連する問題