具有 SQL Server 后端的访问错误“此记录集不可更新”

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

我有一个显示客户列表的表格。该表单包含 3 个组合框,其他是文本框。因此,当我将表添加到包含进入组合框的数据的查询时,它不起作用,但是当我删除表时,查询变为可更新。我附上了两个查询的图像。

可更新查询

SELECT [1-01_Clients_tbl].CNR, 
[FNC] & " " & [SNC] AS [Service User Full Name], 
[1-01_Clients_tbl].PT AS [Physiotherapist name (adjust)], 
[1-01_Clients_tbl].[PDS Score (txt)] AS [Score (txt)], 
[1-01_Clients_tbl].[PDS Score (nmbr)] AS [Score (No)],
[1-01_Clients_tbl].[Date for WLI],
[1-01_Clients_tbl].DOB AS [Date of Birth],
[1-01_Clients_tbl].TASCode,
[1-01_Clients_tbl].PTact AS [Active Status Physio Details (adjust)], 
[_Circular_Temp].ActiveStatus AS [Active Status APH]
FROM ([1-01_Clients_tbl] 
LEFT JOIN [1-01-Clients_TransferXtra_tbl] ON [1-01_Clients_tbl].CNR = [1-01-Clients_TransferXtra_tbl].CNR) 
LEFT JOIN _Circular_Temp ON [1-01_Clients_tbl].CNR = [_Circular_Temp].CNR
WHERE ((([1-01_Clients_tbl].CNR)<>1 Or ([1-01_Clients_tbl].CNR)=2) 
AND (([_Circular_Temp].ActiveStatus)="yes"));

不可更新的查询

SELECT [1-01_Clients_tbl].CNR, 
[FNC] & " " & [SNC] AS [Service User Full Name], 
[1-01_Clients_tbl].PT AS [Physiotherapist name (adjust)], 
[1-01_Clients_tbl].[PDS Score (txt)] AS [Score (txt)], 
[1-01_Clients_tbl].[PDS Score (nmbr)] AS [Score (No)], 
[1-01_Clients_tbl].[Date for WLI], 
[1-01_Clients_tbl].DOB AS [Date of Birth], 
[1-01_Clients_tbl].TASCode, 
[1-01_Clients_tbl].PTact AS [Active Status Physio Details (adjust)], 
[_Circular_Temp].ActiveStatus AS [Active Status APH], 
[5-10_TeamActiveStatus_Codes_tbl].TextVisible, 
[2-01_TeamIDNormalized_tbl].CTeamID
FROM (((([1-01_Clients_tbl] 
LEFT JOIN [1-01-Clients_TransferXtra_tbl] ON [1-01_Clients_tbl].CNR = [1-01-Clients_TransferXtra_tbl].CNR) 
LEFT JOIN _Circular_Temp ON [1-01_Clients_tbl].CNR = [_Circular_Temp].CNR) 
INNER JOIN [5-10_TeamActiveStatus_tbl] ON [1-01_Clients_tbl].CNR = [5-10_TeamActiveStatus_tbl].CNR) 
LEFT JOIN [2-01_TeamIDNormalized_tbl] ON [1-01_Clients_tbl].CNR = [2-01_TeamIDNormalized_tbl].CNR) 
INNER JOIN [5-10_TeamActiveStatus_Codes_tbl] ON [5-10_TeamActiveStatus_tbl].TeamActiveStatusCode = [5-10_TeamActiveStatus_Codes_tbl].TAScodeID
WHERE ((([1-01_Clients_tbl].CNR)<>1 Or ([1-01_Clients_tbl].CNR)=2) 
AND (([_Circular_Temp].ActiveStatus)="yes"));

A)可更新查询的图像

1)查询

2)查询的数据表视图

3)与上述查询相关联的表单的设计视图

4)实际工作形式

请注意,缺少 CTeamID(表单中的团队列)和可见文本(表单中的团队活动状态列),因为这些数据来自两个不同的表,这就是问题开始的地方。

B)不可更新查询的图像

1)查询

2)查询的数据表视图

3)表格

所以当我在这里添加表格时,我们从那里获取CTeamID(表单中的团队列)Text Visible(表单中的团队活动状态列)数据,它现在不可更新查询。

关于如何使其工作或如何改进查询以使其可更新的任何想法或建议?提前谢谢你。

sql-server ms-access odbc
1个回答
0
投票

好吧,看起来“内部连接”的引入是导致这个查询爆炸的原因。

但是,我会考虑在 sql server 中构建查询,并作为视图链接。

但是,请记住:

基于访问的表允许连接和更新多个表。

SQL 服务器:

您可以有一个包含多个表的查询(或更好的视图),但只能更改其中一个表。

换句话说,如果您编辑一些属于 MORE 然后一个表的列,则 SQL Server 表不允许这样做。

再次:

视图可以有多个表,但如果您从多个表中编辑一列,然后是一个不同的表,则更新不适用于基于 SQL 的表。 (它确实适用于基于访问的那些)。

因此,除非您可以“禁用”继续表单/数据表上的某些控件以“限制”或“确保”后面只有一个基本表将变得“脏”,否则您将无法使用该界面。这是 SQL Server 的一个限制,并且在使用 Access 表作为后端时不存在(不存在)。

SQL 服务器由于事务,并且是 ATOMIC 不允许查询有一个以上的表并且还可以在一个镜头/命令中更新。

MS 访问表确实允许这样做!

在某些情况下,您可以通过使用文本框的更新后事件“kluge”它,并执行 me.dirty = false(强制写入记录)。由于您将“强制”写入数据,因此永远不会在查询中做更多的事情,然后“一个”表就会变脏。

所以,这是 SQL 表与 Access 表的区别。 (后面的视图/查询中只有一个表会变脏)。

因此,通过在更新后强制写入文本框中的行数据,就可以完成这项工作。

因此,我会为此目的使用连续表格(而不是数据表)(连续表格,我的意思是所谓的多项目表格。

所以,虽然你可以/可以/可能使第二个查询工作(你必须将内部连接更改为左连接),但新问题将是,如果你允许在该行中进行编辑,这将导致不止一个表变脏,那么更新将不起作用。

所以,你要么:

必须确保该查询后面只有一个表被更改。

或者,在更新每个文本框后添加 me.dirty = false 的 kluge。

或者,考虑有一个弹出表单的按钮,并且在允许编辑的查询中只有来自一个基表的列。

所以,请记住,在喝完一壶咖啡后,说你真的让那个查询变得可更新?

请记住,在任何给定时间,后面只有一张桌子会变脏。这意味着/建议虽然可以在该行中进行编辑,但一次只能从后面的一个表中的列变脏。

所以,如前所述,我会考虑将该客户端查询转换为视图,因为这将有助于整个查询的操作。

因此在 sql 管理器中,您可以右键单击视图,然后选择编辑。测试它。这样,在尝试确定查询是否可以/确实允许更新时,您不必返回到 ms-access。

请记住,链接视图时必须回答提示以输入行 PK id 以进行访问。请记住,如果您重新链接(指向前端)到与 SQL Server 不同的后端?那么链接视图的 PK 行值可能并且将会丢失。这个问题可以在单独的问题/帖子中处理,但您确实需要记住这些附加信息。

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