首页 > 解决方案 > 参数化 RecordSource 查询以确保数据保持可更新?

问题描述

我在主表单中有一个子表单,它设置为数据表视图并根据表单提供的参数从 SQL Server 数据库中提取数据。

这意味着从组合框中选择不同的团队或从日期选择器中选择日期,会将相关信息提取到数据表中。

用户需要能够操作数据中的布尔字段,到目前为止,我发现可以加载此数据并使其保持可更新的唯一方法是将查询.RecordSource完全写入 VBA 中的属性中,如下所示:

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以使其可更新?

标签: sql-servervbams-access

解决方案


我在 fmsinc.com 上找到了这个:

查询或记录集可能无法更新的原因有很多。有些很明显:

  • 该查询是总计查询(使用 GROUP BY)或交叉表查询(使用 TRANSFORM),因此记录不是单独的记录
  • 该字段是计算字段,因此无法编辑
  • 您没有编辑表或数据库的权限/权限
  • 查询使用 VBA 函数或用户定义的函数,并且数据库未启用(受信任)以允许代码运行

有些原因不太明显,但无法避免:

  • 正在修改的表是没有主键的链接表。对于某些后端数据库(例如 Microsoft SQL Server),Access/Jet 需要对表进行键控才能进行任何更改。这是有道理的,因为 Access 想要发出 SQL 查询以进行修改,但无法唯一标识记录。

这些情况不太明显:

  • 项目清单
  • 某些汇总字段链接到单个记录且单个记录仍无法编辑的查询
  • 具有不在关键字段上的多表连接的查询
  • 联合查询

如果查询是可更新的,那么记录集必须是可更新的。我通过使用 ADO 对象解决了这个问题。

请参阅MS Access 2019 - SQL Server 2017 -在 Stack Overflow 上无法在此处更新记录集。


推荐阅读