为RecordSource查询设置参数,以确保数据可更新?

问题描述 投票:0回答:1

我在主窗体中有一个子窗体,该窗体设置为数据表视图,并根据窗体提供的参数从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中以使其可更新?

sql-server vba ms-access access-vba
1个回答
1
投票

我在fmsinc.com上找到了它:

有许多原因导致查询或记录集无法更新。有些很明显:

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

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

  • 正在修改的表是没有主键的链接表。对于某些后端数据库(例如Microsoft SQL Server),Access / Jet要求对表进行键控以进行任何更改。这很有意义由于Access希望发出SQL查询以进行修改,但不能唯一标识记录。

这些情况不太明显:

  • 列表项
  • 具有一些汇总字段的查询,这些字段与单个记录和单个记录仍然无法编辑
  • 具有不在关键字段上的多表联接的查询
  • 联合查询

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

请参见堆栈溢出中的MS Access 2019 - SQL Server 2017 - Recordset cannot be updated。>>

© www.soinside.com 2019 - 2024. All rights reserved.