1

インターンシップ プロジェクト用のジャーナル プログラムを作成し、MS-Access データベースを使用しています。私はVB.netでプログラミングしています。今、私は彼らがジャーナルを「更新」できるようにしようとしています。つまり、カレンダーの日付をクリックすると、その日付のジャーナルがある場合はそのジャーナルに移動します。その日付のものがあれば、その日付のタイトルとジャーナル テキスト エントリが表示されます。更新ボタンをクリックすると、ジャーナルに加えた変更 (テキストボックスフィールドの編集) がデータベースでも変更されるようにしたいと考えています。これが私がこれまでに持っているものです

    Private Sub COE_JournalBtn_Click(sender As System.Object, e As System.EventArgs) Handles COE_JournalBtn.Click

    If DateTimePicker1.Value <> Nothing Then

        If TitleTxt.Text <> "" Then

            If JournalTextRtxt.Text <> "" Then

                myConnection.Open()

                Dim DatePicked As String = DateTimePicker1.Value
                Dim cmd As OleDbCommand
                Dim str As String

                Try

                    MyJournalTitle = TitleTxt.Text
                    MyJournalText = JournalTextRtxt.Text

                    str = "UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked

                    cmd = New OleDbCommand(str, myConnection)

                    cmd.ExecuteNonQuery()

                    myConnection.Close()

                Catch ex As Exception

                    MessageBox.Show("There was an error processing your request. Please try again." & vbCrLf & vbCrLf & _
                                    "Original Error:" & vbCrLf & vbCrLf & ex.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    myConnection.Close()

                End Try

                myConnection.Close()

            End If

        End If

    End If

End Sub

今、私の更新文字列自体は

"UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked

さて、何が起こるか、絶対に何もありません。エラーボックスは表示されません。メッセージボックスは表示されません。プログラムはフリーズしません。そして、データベースは変更されません。私は何を間違っていますか?コードにエラーがあるか、何か不足していますか? 私は本当にこれを理解したいので助けてください.VB.netで解決策を探していましたが、SQLではなくMS-Accessを使用しているという私に当てはまる解決策が見つかりません.

前もって感謝します、リチャード・パウリチェリ

4

2 に答える 2

4

パラメータ化されたクエリを使用して、SQL インジェクション攻撃と引用の問題を回避します

str = "Journals SET JournalTitle=?, JournalText=? WHERE JournalDate=?"
cmd = New OleDbCommand(str, myConnection) 
cmd.Parameters.AddWithValue("@jounalTitle", MyJournalTitle )
cmd.Parameters.AddWithValue("@journalText", MyJournalText)
cmd.Parameters.AddWithValue("@journalDate", DatePicked)
cmd.ExecuteNonQuery() 

パラメーターを使用すると、コードを入力エラーの可能性が高くなる引用を続けることからコードを解放できます。そして、 SQLインジェクションに問題はありません

于 2012-08-06T18:08:04.793 に答える
3

UPDATEステートメントの次の部分に問題がある可能性があります。

"' WHERE JournalDate=" & DatePicked

Journals フィールドJournalDateが Date/Time データ型の場合、日付文字列値を Access 日付区切り文字 ( #) で囲みます。

"' WHERE JournalDate=#" & DatePicked & "#"

ローカルに基づく日付リテラルの誤解を避けるために、日付文字列を yyyy-mm-dd 形式に変換することもできます。

代わりにパラメーター クエリを使用するという提案に同意します。元の試みが失敗した理由を理解できるように手助けしようとしているだけです。

于 2012-08-06T18:09:02.940 に答える