我在主窗体中有一个子窗体,该窗体设置为数据表视图,并根据窗体提供的参数从SQL Server数据库中提取数据。
这意味着从组合框中选择其他团队或从日期选择器中选择日期,会将相关信息拉入数据表。
用户需要能够操作数据中的布尔字段,到目前为止,我发现可以加载此数据并保持其可更新性的唯一方法是在VBA的.RecordSource
属性中编写查询完全像下面这样:
Set mf = mainFrm
S = " SELECT t.Date, t.Team, s.Username, t.Reference, t.Status, t.Reason, t.Completed " & _
" FROM [ODBC;DRIVER=SQL Server;SERVER=<SERVERNAME>;Integrated_Security=SSPI;DATABASE=<DBNAME>].testTbl as t " & _
" INNER JOIN [ODBC;DRIVER=SQL Server;SERVER=SRVFOSABESQL01;Integrated_Security=SSPI;DATABASE=MO_Productivity].staffTbl as s ON t.emp_id = s.emp_id " & _
" WHERE t.Team = '" & tmName & "' AND t.Date = #" & wkEnd & "# " & _
" ORDER BY t.Reference; "
mf.subFrm.Form.RecordSource = S
显然,这里的巨大问题是,提供的变量可以进行SQL注入,不会被转义,并且显然暴露了连接字符串。所有这些都可以解决,但是肯定不会感到“最佳实践”。
[我尝试使用.Recordset
属性通过传递参数化查询/存储过程从服务器获取数据,但这似乎是将数据放入其中并使其成为'取消链接”或无法更新。
什么是从SQL Server检索此数据的正确且更安全的方法,因此可以将其放置在RecordSource
中以使其可更新?
我在fmsinc.com上找到了它:
有许多原因导致查询或记录集无法更新。有些很明显:
某些原因不太明显,但无法避免:
这些情况不太明显:
如果查询是可更新的,那么记录集必须是可更新的。我通过使用ADO对象解决了这个问题。
请参见堆栈溢出中的MS Access 2019 - SQL Server 2017 - Recordset cannot be updated。>>