1

こんにちは、VB.Net アプリケーションから Access データベースへの修正の更新に問題があります。次のエラーが表示されます。

「更新ステートメントの構文エラー」または「条件式のデータ不一致エラー」

以下にコードを示します。

Public Function save1stsemester() 'このコードは、第 1 学期のレコードをデータベースに更新します

    Dim ds As New DataSet
    Dim dbSource As String
    Dim conn As New OleDb.OleDbConnection
    Dim dbcursor As Integer = 0
    Dim da As New OleDb.OleDbDataAdapter
    Dim cmdUpdate As New OleDb.OleDbCommand


    Dim msg1 As String
    Dim style As MsgBoxStyle
    Dim result As MsgBoxResult
    Dim title, remarks As String

    Dim totalgrade As Integer = CInt(txtTotalMK.Text)
    Dim totalload As Integer = CInt(txtTotalLoad.Text)

    Dim gpadecimal As Decimal
    gpadecimal = CDec(lblGPA1.Text)

    title = "Success"
    style = MsgBoxStyle.Information

    Call allremarks() ' this function gathers all the remarks to a single variable.
    remarks = allremarks()

    Dim failflag As Boolean
    If checkflag100() = True Then 'True means all courses were passed then turn on Flag
        failflag = True
    Else
        failflag = False
    End If


    If conn.State = ConnectionState.Open Then
        GoTo cont
    Else
        If conn.State = ConnectionState.Closed Then
            dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
            dbSource = "Data Source =C:\CGPA\e-CGPA Stat\e-CGPA Stat\bin\Debug\Scoredata.mdb;Persist Security Info=False"
            conn.ConnectionString = dbProvider & dbSource
            conn.Open()

            da.SelectCommand = New OleDb.OleDbCommand("SELECT * FROM 100Level1stSemester WHERE MatNO like '%" + cmbMATNO.Text + "%'")
            da.SelectCommand.Connection = conn

            Dim mycomand As New OleDb.OleDbCommandBuilder(da)

            da.Fill(ds, "100Level1stSemester")

cont:       If cmbCourseLevel.SelectedItem = "100 Level" Then
                '  Try
                cmdUpdate.CommandText = "UPDATE 100Level1stSemester " & _
                "SET MatNo = '" & cmbMATNO.Text & "'" & _
                ", FName = '" & cmbStatFName.Text & "'" & _
                ", MName = '" & cmbStatInitial.Text & "'" & _
                ", SName = '" & cmbStatSname.Text & "'" & _
                ", STA110 = '" & txtGR1.Text & "'" & _
                ", MTH110 = '" & txtGR2.Text & "'" & _
                ", MTH112 = '" & txtGR3.Text & "'" & _
                ", ACC111 = '" & txtGR4.Text & "'" & _
                ", GST111 = '" & txtGR5.Text & "'" & _
                ", GST112 = '" & txtGR6.Text & "'" & _
                ", GST123 = '" & txtGR7.Text & "'" & _
                ", [STA110-SCORE] = '" & txtSC1.Text & "'" & _
                ", [MTH110-SCORE] = '" & txtSC2.Text & "'" & _
                ", [MTH112-SCORE] = '" & txtSC3.Text & "'" & _
                ", [ACC111-SCORE] = '" & txtSC4.Text & "'" & _
                ", [GST111-SCORE] = '" & txtSC5.Text & "'" & _
                ", [GST112-SCORE] = '" & txtSC6.Text & "'" & _
                ", [GST123-SCORE] = '" & txtSC7.Text & "'" & _
                ", [Tot-Grade-Point] = '" & totalgrade & "'" & _
                ", [Tot-Credit-Load] = '" & totalload & "'" & _
                ", [1stSemesterGPA] = '" & gpadecimal & "'" & _
                ", Remarks = '" & remarks & "'" & _
                ", Flag = '" & failflag & "'" & _
                " WHERE MatNo = '" & cmbMATNO.Text & "'"

                cmdUpdate.CommandType = Data.CommandType.Text
                cmdUpdate.Connection = conn
                cmdUpdate.ExecuteNonQuery()
                cmdUpdate.Dispose()

                conn.Close()

                msg1 = "100 Level 1st semester exam score and grades updated successfully."

                result = MsgBox(msg1, style, title)
                cmdVerifySem1.Enabled = False
                Grp1stSEM.Enabled = True

                'Catch
                MessageBox.Show("An error occured while updating the student's 100 Level scores! Duplicate entry was detected in the database. Ensure that the student's scores has not been entered before and try again.")
                'End Try
            End If
        End If
    End If
End Function

パラメーター化されたクエリを使用するように勧められましたが、使用方法がわかりません。

どんな助けでも大歓迎です

ありがとう

4

2 に答える 2

0

通常Data Mismatch、数値列を数値以外の値に設定しようとしたり、データ型が異なる列で 2 つのテーブルを結合しようとしたりすると、エラーが発生します。結合せずにここで更新しているため、構築された SQL ステートメントを調べて、有効な値が各列に入力されていることを確認してください。Criteria特に次の値を参照することを考えると、cmbMATNO.Text

于 2012-12-13T16:39:54.017 に答える
0

更新に使用しているコマンド テキストは、その書き方のせいでかなり読みにくいものです。これは、パラメーター化されたクエリを使用する正当な理由の 1 つですが、最善の理由とは言えません。パラメータ化されたクエリを使用したサンプルを次に示します。

    Dim cmdText As String = "INSERT INTO Customer(Name, EmailAddress) VALUES (?,?)"
    Dim cmd As OleDbCommand = New OleDbCommand(cmdText, con)
    cmd.CommandType = CommandType.Text
    cmd.Parameters.Add("@p1", OleDbType.VarChar).Value = txtUserName.Text
    cmd.Parameters.Add("@p2", OleDbType.VarChar).Value = txtEmail.Text

基本的に、あなたは?変数/テキストボックスの値で置き換える値を表す文字列に。次に、コマンド文字列に表示されるのと同じ順序で、それぞれのコマンドにパラメーターを追加します。これにより、コマンド文字列の読み取りと適切な構文の確認がはるかに簡単になります。また、データベースをインジェクションから保護します。

于 2012-12-13T16:39:55.143 に答える