为什么无法访问更新 table?

Why can't Access update table?

访问前端,SQL服务器后端。

简单更新查询

PARAMETERS ParamTransactionID Long, ParamVoidFlag Short;
UPDATE tblTransaction 
SET tblTransaction.VoidInProgressFlag = [ParamVoidFlag]
WHERE (tblTransaction.TransactionID=[ParamTransactionID]);

在这里使用查询

Set qdef = CurrentDb.QueryDefs("qUPD-tblTransaction_VoidInProgress")
qdef.Parameters![ParamVoidFlag] = VoidFlag
qdef.Parameters![ParamTransactionID] = TransactionID

qdef.Execute dbFailOnError + dbSeeChanges

qdef.Close

给予

[Microsoft][ODBC SQL Server Driver]Query timeout expired
ODBC--update on a linked table 'tblTransaction' failed.

直接编辑 table 即可。
打开查询并提供参数有效。
从应用程序仍然没有。

更新
删除视图,不影响。
旧版本现在出现同样的故障,看来不是代码问题。
唯一的共同点是 table,所以这可能是我在那里做的一个小改动。
我会检查一下,看看是 table 还是整个数据库。
但似乎很奇怪,我可以通过 运行 直接查询来进行更改,但却从代码中 运行 得到不同的结果。

更新 2 我认为这可能与整个数据库以某种方式只读有关,而这只是它受到攻击的第一个地方。但不是。其他表单可以毫无问题地更新其 table。
所以它看起来与特定的table有关。但是,仅通过 运行 更新查询就可以完美地更新,这似乎仍然很奇怪。

更新 3 为了使测试更容易,我 运行 从主菜单表单查询,而不是遍历所有表单直到失败。
运行 针对原始数据库模式有效。再次进行相同的更改,将 NTEXT 替换为 VARCHAR(MAX),它仍然有效。
回到原来的table,仍然有效。
返回所有表格,失败。
所以问题似乎与其中一种打开的形式有关。
我将再次回顾该序列。
此外,这也解释了为什么它在查询中起作用而不是在表单中起作用。
遗憾的是,当表单打开时,我无法查询 运行。

好的,第一个问题是 why/how 您是否为参数选择了“短”数据类型?

应该是:

PARAMETERS ParamTransactionID Long, ParamVoidFlag Bit;
UPDATE tblTransaction 
SET tblTransaction.VoidInProgressFlag = [ParamVoidFlag]
WHERE (tblTransaction.TransactionID=[ParamTransactionID]);

您还声明当您从 UI.

运行 查询时此查询有效

所以,在代码中,你有这个:

确保所有代码模块在开始时都有显式选项,如下所示:

Option Compare Database
Option Explicit

所以,您的代码现在应该是:

Dim qdef      as DAO.QueryDef

Set qdef = CurrentDb.QueryDefs("qUPD-tblTransaction_VoidInProgress")
qdef.Parameters![ParamVoidFlag] = VoidFlag
qdef.Parameters![ParamTransactionID] = TransactionID

qdef.Execute dbFailOnError + dbSeeChanges

因此请更正 ParmaVoidFlag 的数据类型。

此外,请检查左侧中窗格中的 table 名称 - 是吗

dbo_tblTransaction

tblTransaction.

此外,在设计视图中打开 linked table -(忽略只读消息)。看数据类型。您必须定义 PK - 因此请检查 PK。

接下来,在 sql 服务器端,true/false 字段不能有默认值 null。如果他们这样做,则更新将失败。所以在 sql 服务器中,确保有问题的 table 设置了默认值 0。

最后但并非最不重要的一点? 如果查询还是出错,那么需要给sql服务器table添加时间戳(不是日期时间),然后重新link。如果任何列是浮点数,则此 will/is 是必需的。

将选项显式添加到代码模块的开头后,还可以从菜单中执行调试->编译 - 确保代码编译。

事实证明,如果打开了特定表单,查询将失败。 该表单查询了相同的 table,但使用的是 Snapshot 而不是 Dynaset。 我不知道为什么会锁定 table。它有一个适当的键和索引。但 Dynaset 修复了它。