2

我正在为 Access 创建一个记事本应用程序——只是为了保持敏锐。我已经创建了容纳记事本的表格和用于各种功能的几个按钮。记事本被保存到一个名为 a 的表tblContentsMemo- 这是因为在文本中找到 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 回答