首页 文章

TSQL查询可以使用Access Forms中的值吗?

提问于
浏览
0

我正在使用一个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 回答

  • 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
    

相关问题