2

私は Access 用のメモ帳アプリケーションを作成している最中です。メモ帳とさまざまな機能用のいくつかのボタンを収容するためのフォームを作成しました。tblContentsメモ帳は と呼ばれるテーブルに保存さMemoれます。これは、テキストの文字数が 255 文字に制限されているためです。

SO から大量のテキストをコピーして、アポストロフィーの問題に気づきました。テキストをテーブルに保存するときに、アポストロフィを追加するときに SQL ステートメントを実行することがわかります。実行するには、特定の構文 (この時点では覚えていません) である必要があります。

ユーザーが入力したもの、アポストロフィなどを正確に維持するために、同じ SQL を使用してこれを追加する方法はありますか? 入力をループして、すべてのアポストロフィを削除したくありません。

ユーザーが入力したものを追加するための私のコードは次のとおりです。

'Save the memo
Public Sub SaveMemo()

    'Examine the memo object
With Forms!frmNotepad!memo

    'Set focus to memo in order to get length
    .SetFocus

    If Len(.Text) > 0 Then

        'Save to table
        Dim memoContents As String
        memoContents = .Text

        Dim strSQL As String
        strSQL = "INSERT INTO tblContents (Contents)" & _
                 "VALUES ( '" & memoContents & "' ); "

        'Set the database and execute the SQL
        Dim db As Database
        Set db = CurrentDb

        db.Execute strSQL, dbFailOnError

    Else

        MsgBox ("Nothing to save!")

    End If

End With


End Sub
4

2 に答える 2

3

ここ (および他の場所) でサンプル コードを探している場合は、SQL インジェクションという用語に遭遇した可能性があります。これは、アポストロフィ (およびその他のおかしなビジネス) を含むユーザー入力が、驚くべき、時には深刻な副作用をもたらす可能性があるメカニズムです。

Access 自体で操作している場合は、Recordset を使用してテーブルを更新することで、問題を回避できます。INSERT使用できるステートメントを実行する代わりに

Dim cdb As DAO.Database, rst As DAO.Recordset
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset("tblContents", dbOpenDynaset)
rst.AddNew
rst!Contents = memoContents
rst.Update
rst.Close
Set rst = Nothing
Set cdb = Nothing

そうすれば、文字のエスケープや SQL インジェクションによるつまずきを心配する必要がなくなります。

于 2013-05-14T12:30:54.633 に答える
2

Replace() 関数を使用できます

memoContents = .Text
memoContents  = Replace(memoContents ,"'","''")
于 2013-05-14T11:29:58.587 に答える