0

TextBox でユーザーからの入力を受け取り、グリッドにレコード/データを表示 (「含む」) するフォームがあります。ただし、入力データのことを達成できません。私はしばらくの間、これを解決しようとしています。データベースは MS Access です。他のすべては正常に動作します。ありがとうございました。

これが私のコードです。このクエリでは、フォーム グリッドに値がまったくありません。

PS: 私はただの初心者です :) ありがとうございます!

Imports System.Data.OleDb

Public Class Form1

    Dim dbConnection As OleDbConnection
    Dim dbCommand As OleDbCommand
    Dim dbDataAdapter As OleDbDataAdapter
    Dim ConnectString As String = "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source=atg.mdb"
    Dim dtATG As DataTable
    Dim Searchq, SQLStr As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim dtATG As New DataTable() ''// Create New Datatable

        Searchq = TextBox1.Text
        dbDataAdapter = New OleDbDataAdapter
        SQLStr = "SELECT * FROM ATG WHERE Term Like " & """%" & CStr(TextBox1.Text) & "%"""

        dbDataAdapter.Fill(dtATG)

        DataGrid1.DataSource = dtATG
    End Sub

End Class
4

1 に答える 1

4

どの RDBMS を使用していますか?

SELECT * FROM ATG WHERE Term LIKE '% %'

テキスト ボックスの値をクエリ文字列に直接渡さないでください。

  1. 選択基準、別名列をリストしていません。SELECT と FROM の間に少なくとも 1 つの列を指定するか、上記のようにすべてのアスタリスクを選択する必要があります。
  2. LIKE 句では、モジュロ別名パーセント記号の代わりにアスタリスクを使用しています。SQL では、フィールドのワイルドカードは * ではなく % です。
  3. テキスト ボックスの値を使用して文字列を作成しようとしています。誰かが入力できるイベントでそのテキストボックスが検証されていない限り:

123'; DROP TABLE ATG;

したがって、レンダリングされた文字列は次のようになります。

SELECT * FROM ATG WHERE Term LIKE '% 123'; DROP TABLE ATG; %'

技術的には無効な SQL ですが、クエリの最初の 2 つのステートメントを実行すると、データベースからテーブルが削除されます。これに対する適切な解決策は、値を SQL クエリに渡す前にフォーム入力を確認し、SQL パラメータを使用して、悪意のあるステートメントを渡すことを心配することなくクエリを構築することです。

SQL パラメータを使用した OleDb サンプルについては、こちらを参照してください

インターフェイスを介して悪意のあるステートメントを渡し、SQL を介して RDMBS で問題を引き起こすことは、SQL インジェクションとして知られています。

于 2011-07-03T08:15:47.210 に答える