1

次のコードを使用して、2 つのテーブルからデータを取得し、ComboBox にその情報を入力しようとしています。次に、ユーザーが ComboBox から値を選択すると、フォーム上のすべてのコントロールに、ComboBox の値と一致する DB から取得したデータを入力したいと考えています (これを行う方法はまだわかりません)。

注: エラーに表示されている 1090 は、InputBox コントロールから受け取り、それに TextboxAccount.Text 値を設定しているアカウント番号です。したがって、これが私の問題なのかどうかはわかりません。

スローされる VB 例外は次のとおりです。

「SQL 構文にエラーがあります。1 行目の 'customer.accountNumber = '1090" 付近で使用する正しい構文については、MySQL バージョンに対応するマニュアルを確認してください」

これが私のコードです:

    Private Sub RetrieveMySQLdata()

    Try
        'FOR MySQL DATABASE USE
        Dim dbConn As New MySqlConnection
        Dim dbQuery As String = ""
        Dim dbCmd As New MySqlCommand
        'Dim dbData As MySqlDataReader
        Dim dbAdapter As New MySqlDataAdapter
        Dim dbTable As New DataTable
        If dbConn.State = ConnectionState.Closed Then
            'dbConn = New MySqlConnection
            dbConn.ConnectionString = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password)
            dbConn.Open()
        End If

        dbQuery = "SELECT *" & _
                   "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
                   "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"
        With dbCmd
            .CommandText = dbQuery
            .Connection = dbConn
        End With
        With dbAdapter
            .SelectCommand = dbCmd
            .Fill(dbtable)
        End With
        Dim i As Integer
        For i = 0 To dbTable.Rows.Count - 1
            ComboBoxCard.ValueMember = "cc_Number"

        Next
    Catch ex As Exception
        MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _
                    vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.")
    End Try

End Sub
4

1 に答える 1

1

この声明では:

dbQuery = "SELECT *" & _
          "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
          "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"

cc_master.customer_accountNumberandなど、一部の句の間にスペースはありませんWHERE。結果の文字列は次のようになります。

SELECT *FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumberWHERE customer.accountNumber = 'SOME SQL INJECTABLE STRING'

MySQL 構文エラー メッセージの一般的なヒントとして、次のようなメッセージが表示された場合:

「SQL 構文にエラーがあります。1 行目の 'customer.accountNumber = '1090" 付近で使用する正しい構文については、MySQL バージョンに対応するマニュアルを確認してください」

構文エラーを見つけるには、「近い」部分の直前を確認する必要があります。クエリ パーサーは最初から最後まで読み取り、解釈できないものを見つけるとエラーをスローします。そして通常、最初に解釈できないのは、タイプミス/エラーの後に最初に目にするものです。

また、文字列連結を使用することは、SQL クエリを構築する上で非常に悪い考えであることに注意してください。これにより、SQL インジェクション攻撃に対して無防備になります。 普通の古い ADO.NET を使用している場合は、少なくともパラメーター化されたクエリを使用する必要があります。さらに一歩進んで、LINQ to SQL や Entity Framework などを調べて、自動生成されたコードの背後でデータベース アクセスを抽象化し、舞台裏でパラメーター化することもできます。

于 2012-09-30T11:53:28.220 に答える