TSQL 查询可以使用访问表单中的值吗?
Posted
技术标签:
【中文标题】TSQL 查询可以使用访问表单中的值吗?【英文标题】:Possible for TSQL query to use a value from a Access Forms? 【发布时间】:2015-09-25 17:58:33 【问题描述】:我正在开发一个 Access DB,它具有 ODBC 链接的 SQL Server 表,并且我有以下脚本来运行 TSQL 查询,如您所见,我尝试在查询中包含 Access Forms 中的值,但它未能跑。当我执行脚本时,表单被打开并填充了数据。我想知道这是不可能的还是有另一种方法?我是 TSQL 和 SQL 服务器的新手,这是我的问题。欣赏是否有人可以提供帮助。非常感谢。
Function formtest()
Dim qryd As QueryDef
Set qryd = CurrentDb.CreateQueryDef("")
qryd.Connect = "ODBC;DSN=SQLSERVER;"
qryd.SQL = "UPDATE dbo.table1 SET firstname = [Forms]![testform]![datainput]"
qryd.ReturnsRecords = False
qryd.Execute
End Function
【问题讨论】:
您希望服务器如何从您的本地文件中读取数据?您必须从本地文件中读取并将其发送到服务器。 【参考方案1】:SQL Server 对您的表单一无所知。您必须使用查询发送数据。像这样的:
qryd.SQL = "UPDATE dbo.table1 SET firstname = '" & [Forms]![testform]![datainput] & "'"
您必须注意的一件事是,如果您的 datainput
中有任何单引号,则可能会使 SQL 无效。这也可能是一个安全问题。要么测试单引号并引发错误,要么将它们中的每一个替换为两个。
最好的方法是使用参数化查询。这绝对可以防止 SQL 注入问题,并且在许多情况下也有助于提高性能。不幸的是,我不相信您可以使用 DAO 为 SQL Server 创建参数化查询。您必须转换为 ADO,它最适合向 Jet 以外的 SQL 引擎发送查询。
要使用 ADO,您可能必须通过打开 VBA 代码窗口并选择工具 -> 引用 -> 并选中旁边的框来添加对 Microsoft ActiveX 数据对象的引用。然后您的代码将如下所示:
Dim Conn1 As ADODB.Connection
Dim Cmd1 As ADODB.Command
Dim Param1 As ADODB.Parameter
Rem Create and Open Connection Object.
Set Conn1 = New ADODB.Connection
Conn1.ConnectionString = "ODBC;DSN=SQLSERVER;"
Conn1.Open
Rem Create Command Object.
Set Cmd1 = New ADODB.Command
Cmd1.ActiveConnection = Conn1
Cmd1.CommandText = "UPDATE dbo.table1 SET firstname = ?"
Rem Create Parameter Object.
Set Param1 = Cmd1.CreateParameter(, adVarChar, adParamInput, 25)
Param1.Value = [Forms]![testform]![datainput]
Cmd1.Parameters.Append Param1
Set Param1 = Nothing
Rem Open Recordset Object.
Call Cmd1.Execute
【讨论】:
这对 sql 注入是开放的。 正确...我警告过的安全问题称为“SQL 注入”。这个sn-p的用户一定要做好预防措施。 为什么不直接调整你的答案并参数化呢?那么这将是一个很好的答案。 感谢@Brian Pressler,效果很好!!非常感谢。我搜索了sql注入定义,似乎只适用于web应用程序? Access脚本也会发生这种情况吗?谢谢。 SQL 注入在您通过与用户输入的变量连接来构建查询字符串的任何情况下都可能成为问题。它在网络编程中通常非常重要,因为用户通常通过互联网。在客户端用户需要有权直接连接到 SQL Server 的 Access 项目中,这可能不是什么大问题,因为您的用户通常是您组织的员工,但它仍然可以被利用。最好使用参数...我在答案中添加了一些附加信息。以上是关于TSQL 查询可以使用访问表单中的值吗?的主要内容,如果未能解决你的问题,请参考以下文章
UDF 可以访问调用 Pig 脚本中声明的参数或定义的值吗?