TSQL 查询可能使用访问表单中的值吗?

Possible for TSQL query to use a value from a Access Forms?

我正在开发一个 Access 数据库,它有 ODBC 链接 SQL 服务器 table,我有以下脚本到 运行 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

SQL 服务器对您的表单一无所知。您必须随查询发送数据。像这样:

qryd.SQL = "UPDATE dbo.table1 SET firstname =  '" & [Forms]![testform]![datainput] & "'"

您必须注意的一件事是,如果您的 datainput 中有任何单引号,它可能会使 SQL 无效。这也可能是一个安全问题。要么测试单引号并引发错误,要么将每个引号替换为两个。

最好的方法是使用参数化查询。这将绝对防止问题 SQL 注入,并且在许多情况下也有助于提高性能。不幸的是,我认为您不能使用 DAO 为 SQL 服务器创建参数化查询。您必须转换为 ADO,它最适合将查询发送到 Jet 以外的 SQL 引擎。

要使用 ADO,您可能必须添加对 Microsoft ActiveX 数据对象的引用,方法是打开 VBA 代码 window 并选择工具 -> 引用 -> 并选中它旁边的框。那么您的代码将如下所示:

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