【问题标题】:Insert into statement with an apostophe using VBA?使用VBA插入带有撇号的语句?
【发布时间】:2020-06-25 20:16:36
【问题描述】:

我有一个带有文本框的表单。我将用户在文本框中输入的内容插入到表格中。如果用户在标有“Me.ProjectName”的文本框中输入撇号,我会收到错误消息。我的代码是:

   CurrentDb.Execute "INSERT INTO Table1(ProjectNumber, Title) " & _
        " VALUES('" & ProjectNumber & "','" & Me.ProjectName & "')"

【问题讨论】:

标签: sql vba ms-access


【解决方案1】:

不应根据用户输入构造和执行动态 SQL。您应该使用参数化查询,例如:

Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.CreateQueryDef("", _
        "INSERT INTO Table1 (ProjectNumber, Title) VALUES (@prjnum, @title)")
qdf.Parameters("@prjnum").Value = ProjectNumber
qdf.Parameters("@title").Value = me.ProjectName
qdf.Execute

【讨论】:

  • 谢谢@gord-thompson。当我有很长的文本(超过 255 个字符)时,我无法运行它。我该如何解决这个问题?
  • 通过在设计视图中打开表来检查列定义。 Short Text(有时称为Text)列定义了最大长度,不能超过 255 个字符。 Long Text(有时称为Memo)列的大小实际上是无限的。
  • 该表已在该特定字段中设置为长文本。我以前也遇到过这种情况,一直不知道怎么解决。不知道你以前有没有遇到过这种情况。
【解决方案2】:

您应该转义您的字符串可能包含引号,方法是将引号替换为 2 个引号:

  Dim SQL As String

  SQL = "INSERT INTO Table1(ProjectNumber, Title) " & _
    " VALUES('" & ProjectNumber & "','" & Replace(Me.ProjectName, "'", "''")  & "')"

  CurrentDb.Execute SQL

【讨论】:

  • 完美。谢谢!
  • @MekenzieBuhr - 如果你决定使用这种方法,请花点时间谷歌“动态 SQL”和“参数化查询”,了解为什么你仍然做错了。
  • @GordThompson 我现在才看到你的评论,因为我有 +1(6 年!)。 SQL 注入在 Access 中几乎不是一回事。您只是为自己编写一些代码,或者最终有十分之一是您的亲密同事,当然不是黑客。 %大多数时候,代码甚至没有被编译,每个人都可以访问它,就像所有底层表一样。您的评论是有效的,但在 MS Access 的上下文中并不重要
猜你喜欢
  • 2017-10-23
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多