Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入带有where子句的语句_Sql_Vba_Ms Access - Fatal编程技术网

Sql 插入带有where子句的语句

Sql 插入带有where子句的语句,sql,vba,ms-access,Sql,Vba,Ms Access,可能重复: 我想使用下面的命令插入值 DoCmd.RunSQL = "insert into tblContract( Empid, Start1, Finish1, Store1, Start2, Finish2, Store2) values ('" & Me.txtEmpNo.Value & "','" & Me.txtContSunStart1.Value & "', '"

可能重复:

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

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)的值是另一个表的最大值(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 access中,它给出编译错误

您可以使用插入选择而不是插入值。比如

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

但另一方面,您不应该按原样构建SQL。这很容易导致SQL注入。有人可以很容易地将“DROP TABLE tblContract”输入到您的文本框中

您可以使用插入选择而不是插入值。比如

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

但另一方面,您不应该按原样构建SQL。这很容易导致SQL注入。有人可以很容易地将“DROP TABLE tblContract”输入到您的文本框中

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

为什么不先使用identity,然后在插入到另一个表后使用scope_identity()函数进行抓取


您还知道,您所做的是等待发生的sql注入攻击。首先,您需要从另一个表中获取值,然后使用该值插入到此表中,您还可以使用触发器来执行此操作。请注意,如果两个用户同时执行同一个查询,那么可能会有两次相同的值……在这种情况下,您需要锁定另一个表……max()是有问题的

为什么不先使用identity,然后在插入到另一个表后使用scope_identity()函数进行抓取


您还知道,如果我正确阅读了您的问题,您所做的就是等待发生sql注入攻击

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

请注意如果我正确阅读了您的问题,这可能会导致并发问题

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


请注意这可能会导致并发问题

您必须澄清一下您的意思。。。您不能在现有行中插入任何内容,这将是一个更新。您的确切副本可能还需要查看存储过程或参数化查询,这将非常不安全,尤其是在面向公众的情况下,它非常容易受到sql注入攻击..值属性应该从sql中删除。你必须澄清一下你的意思。。。您不能在现有行中插入任何内容,这将是一个更新。您的确切副本可能还需要查看存储过程或参数化查询,这将非常不安全,尤其是在面向公众的情况下,它非常容易受到sql注入攻击。应该从sql中删除Value属性。这就是我认为需要做的事情。还有一些!这不是一个好的做法,应该立即取消!要么提前知道外键值并插入该值,要么在同一事务中插入两个表。这就是我认为需要做的。然后是一些!这不是一个好的做法,应该立即取消!要么提前知道外键值并插入该值,要么在同一事务中插入两个表。VBA应用程序上的SQL注入不会引起太大的关注。是的,但VBA应用程序将持续多长时间?这些东西通常都有自己的生活,并得到PortedGroves,有些人确实使用Access作为web界面。此外,您不认为您应该保护您的数据不受不满的员工和外部人士的影响吗?SQl注入不必来自公司外部。此外,学习思考诸如“这是否容易受到攻击”之类的问题,将有助于此人在远离访问权限时的职业生涯。请举一个将访问权限用作“web界面”的例子。事实上,如果您对“访问权限”和“web界面”都使用正确的定义,这是一个荒谬的断言。顺便说一句,关于Access SQL注入,这个线程对其进行了详细分析,表明一般来说,只有一组非常有限的漏洞,它们都不涉及DDL或数据更新——它们仅限于在SELECT语句中伪造WHERE子句,然后返回所有行。VBA应用程序上的SQL注入不会引起太大的关注。是的,但VBA应用程序将持续多久?这些东西通常都有自己的生活,并得到PortedGroves,有些人确实使用Access作为web界面。此外,您不认为您应该保护您的数据不受不满的员工和外部人士的影响吗?SQl注入不必来自公司外部。此外,学习思考诸如“这是否容易受到攻击”之类的问题,将有助于此人在远离访问权限时的职业生涯。请举一个将访问权限用作“web界面”的例子。事实上,如果您对“访问权限”和“web界面”都使用正确的定义,这是一个荒谬的断言。顺便说一句,关于Access SQL注入,这个线程对其进行了散列,并表明一般来说,只有一组非常有限的漏洞,并且没有涉及DDL或数据更新——它们仅限于在SELECT语句中伪造WHERE子句,然后返回所有行。呃,Access不会使用DoCmd.RunSQL命令执行多个语句——它会给您一条“SQL语句结束后的字符无效”错误消息。顺便说一句,这并不意味着您不应该验证用户输入,只是引用的SQL注入示例不可能在Access中发生(或任何形式的Jet/ACE,两者都不支持批处理SQL语句)。呃,Access不会使用DoCmd.RunSQL命令执行多个语句——它会给您一条“SQL语句结束后的无效字符”错误消息。顺便说一句,这并不意味着您不应该验证用户输入,只是引用