2

SQLコマンドを使用してデータベースに新しいレコードを挿入しようとしていますが、プログラムを実行して新しいレコードを追加しようとするたびに、「INSERTINTO」ステートメントに構文エラーがあることを示すエラーが表示されます。私が挿入しているデータは、配列+構造体に格納されています。

    Structure Question
        Dim QuestionName As String
        Dim Question As String
        Dim Ans1 As String
        Dim Ans2 As String
        Dim Ans3 As String
        Dim Ans4 As String
        Dim Difficulty As Integer
        Dim CorrectAns As String
    End Structure

    Dim arrQuestion as Question

これは、データベースにレコードを挿入するために使用するサブIMです。

    Try

        Dim InsertComm As New OleDb.OleDbCommand
        Dim dbAdap As New OleDb.OleDbDataAdapter

        ConnectToDB()

        Dim sqlInsert As String = "INSERT INTO questionDatabase(QuestionName, Question, 
                                   Answer 1, Answer 2, Answer 3, Answer 4, Correct answer,
                                   Difficulty ID) VALUES(" & Chr(39) & arrquestion.questionname 
                                   & Chr(39) & ", " & Chr(39) & arrquestion.question & Chr(39) &
                                   ", " & Chr(39) & arrquestion.ans1 & Chr(39) & ", " & Chr(39) 
                                   & arrquestion.ans2 & Chr(39) & ", " & Chr(39) & 
                                   arrquestion.ans3 & Chr(39) & ", " & Chr(39) & 
                                   arrquestion.ans4 & Chr(39) & ", " & Chr(39) & 
                                   arrquestion.correctans & Chr(39) & ", " & Chr(39) & 
                                   arrquestion.difficulty & Chr(39) & ");"

        InsertComm = New OleDb.OleDbCommand(sqlInsert, dbConn)

        InsertComm.ExecuteNonQuery()

        dbConn.Close()

    Catch ex As Exception
        MsgBox(Err.Description)
    Finally
        dbConn.Close()
    End Try

私はこれを何度も書き直し、それが私に与えるエラーをグーグルで検索し、人々がそこに投稿した解決策をコピーしようとしましたが、彼らがコードをどのように書いたかについて頭を悩ませることはできませんでした。どんな助けでも本当にありがたいです。

4

1 に答える 1

4

あなたの声明の核心はこのように書かれるべきです

Dim sqlInsert As String = "INSERT INTO questionDatabase(QuestionName, Question, " +
      "[Answer 1], [Answer 2], [Answer 3], [Answer 4], [Correct answer], " +
      "[Difficulty ID]) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"
InsertComm = New OleDb.OleDbCommand(sqlInsert, dbConn)
InsertComm.Parameters.AddWithValue("@p1", arrquestion.questionname)
InsertComm.Parameters.AddWithValue("@p2", arrquestion.question )
InsertComm.Parameters.AddWithValue("@p3", arrquestion.ans1)
InsertComm.Parameters.AddWithValue("@p4", arrquestion.ans2)
InsertComm.Parameters.AddWithValue("@p5", arrquestion.ans3)
InsertComm.Parameters.AddWithValue("@p6", arrquestion.ans4)
InsertComm.Parameters.AddWithValue("@p7", arrquestion.correctans)
InsertComm.Parameters.AddWithValue("@p8", arrquestion.difficulty)
InsertComm.ExecuteNonQuery()

ご覧のとおり、最初に行うことは、フィールド名のスペースの問題を解決するために、すべてのフィールド名を角かっこでカプセル化することです。2番目のポイントは、パラメーター化されたクエリを使用して、解析の問題(文字列、日付、小数などの引用符)と最も重要なSQLインジェクションを回避することです。

また、OleDb環境のパラメーターは、それぞれのプレースホルダー(?)がSQLテキストに表示されるのと同じ順序でParametersCollectionに追加する必要があることに注意してください。

于 2013-01-29T20:16:29.363 に答える