2015-09-25 30 views
0

我正在使用Access DB,它具有ODBC链接的SQL Server表,并且我有以下脚本来运行TSQL查询,正如您所看到的,我试图在查询中包含来自Access窗体的值,但它无法运行。当我执行脚本时,表单被打开并填充数据。我想知道这是不可能的还是有另一种方式呢?我是TSQL和SQL服务器的新手,这里是我的问题。如果有人可以帮忙,可以申请。非常感谢。TSQL查询可能使用访问表单中的值吗?

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 
+0

正是你怎么能指望服务器从本地文件读取?您必须从本地文件读取并将其发送到服务器。 – Hogan

回答

3

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 
+0

这对于sql注入是开放的。 –

+0

正确......我警告过的安全问题叫做“SQL注入”。这段代码的用户必须采取预防措施来防止它。 –

+0

为什么不只是调整你的答案,并将其参数化?那么这将是一个很好的答案。 –