【问题标题】:Insert statement with where clause [duplicate]带有 where 子句的插入语句 [重复]
【发布时间】:2009-07-13 14:15:28
【问题描述】:

可能重复:
Query Syntax error

我想使用下面的命令插入值

DoCmd.RunSQL = "insert into tblContract(
 Empid,
 Start1,
 Finish1,
 Store1,
 Start2,
 Finish2,
 Store2)
values ('" & Me.txtEmpNo.Value & "','" 
  & Me.txtContSunStart1.Value & "', '"
  & Me.txtContSunFinish1.Value & "','" 
  & Me.txtContSunStore1.Value & "','" 
  & Me.txtContSunStart2.Value & "', '" 
  & Me.txtContSunFinish2.Value & "','" 
  & Me.txtContSunStore2.Value & "')"

但是在插入时,它应该插入到同一个表中列(testid)的值是另一个表的max(testid)的行中。

此查询不起作用:

SQL =  "
       INSERT INTO tblContract (Empid,testid, Start1, Finish1, Store1, Start2, Finish2, Store2)
       SELECT " & Me.txtEmpNo.Value & "', MAX(testid), '" &
       Me.txtContSunStart1.Value & "', '" & Me.txtContSunFinish1.Value & "','" & 
       Me.txtContSunStore1.Value & "','" & Me.txtContSunStart2.Value & "', '" & 
       Me.txtContSunFinish2.Value & "','" & Me.txtContSunStore2.Value & "' " &
       "FROM tbltesting'"

我正在为此寻找替代方案。在 ms 访问中它给出了编译错误

【问题讨论】:

  • 你必须澄清一下你的意思......你不能在现有行中插入任何东西,那将是一个更新。
  • 您可能还想查看存储过程或参数化查询,这将非常不安全,尤其是在面向公众的情况下,它很容易受到 sql 注入攻击。
  • .Value 属性应该从您的 SQL 中删除。

标签: sql vba ms-access


【解决方案1】:

您可以使用 INSERT SELECT 而不是 INSERT VALUES。比如。

INSERT INTO MyTable (ColumnA, ColumnB, ColumnC) SELECT 'A', 'B', MAX(ColumnC) FROM MyOtherTable

不过,另一方面,您不应该像现在这样构建您的 SQL。这很容易发生 SQL 注入。有人可以很容易地在您的一个文本框中输入“; DROP TABLE tblContract”!

【讨论】:

  • 呃,Access 不会使用 DoCmd.RunSQL 命令执行多条语句——它会给你一个“SQL 语句结束后的无效字符”错误消息。
  • 顺便说一句,这并不意味着您不应该验证用户输入,只是引用的 SQL 注入示例不可能发生在 Access(或任何形式的 Jet/ACE,两者都不是)支持批处理 SQL 语句)。
【解决方案2】:

首先,您需要从另一个表中获取值,然后将其插入到该表中,您也可以使用触发器来执行此操作。请注意,如果 2 个用户同时执行相同的查询,您可以有两次相同的值...在这种情况下您需要锁定另一个表...max() 有问题

为什么不使用标识,然后在插入另一个表后使用 scope_identity() 函数来抓取?

你也明白你所做的是等待发生的 sql 注入攻击

【讨论】:

  • VBA 应用程序上的 SQL 注入问题不大。
  • 是的,但它会成为 VBA 应用程序多久?这些东西通常有自己的生命并被移植
  • mgroves,有些人确实使用 Access 作为 Web 界面。另外,您不认为您应该保护您的数据免受心怀不满的员工和外人的侵害吗? SQl Injection 不必来自公司外部。此外,学会思考诸如“这是否容易受到攻击”之类的事情将有助于此人离开 Access 后的职业生涯。
  • 请举一个使用 Access 作为“Web 界面”的示例。实际上,如果您对“访问”和“Web 界面”都使用正确的定义,那么这是一个无意义的断言。
  • 顺便说一句,关于 Access SQL 注入,这个线程 stackoverflow.com/questions/512174/non-web-sql-injection 对其进行了散列,并表明通常只有非常有限的一组漏洞,并且没有涉及 DDL 或数据更新 -它们仅限于在 SELECT 语句中伪造 WHERE 子句,然后返回所有行。
【解决方案3】:

如果我没看错你的问题

INSERT INTO tblContract(col1..., testId) values
    ('value1',..., (SELECT MAX(testID) FROM tblOther));

警告这可能会导致并发问题

【讨论】:

  • 这就是我认为需要完成的方式。
  • 还有一些!这不是一个好的做法,现在应该被淘汰!要么提前知道外键值并用它插入值,要么在同一个事务中插入两个表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2016-02-05
  • 1970-01-01
相关资源
最近更新 更多