【问题标题】:Why can't Access update table?为什么不能访问更新表?
【发布时间】:2021-11-19 00:17:34
【问题描述】:

访问前端,SQL Server 后端。

简单的更新查询

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.

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

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

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

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

【问题讨论】:

  • 我对 SQLServer 没有太多经验。我有 SQLServer Express 只是为了看看我是否可以让它工作。确实如此。我不使用 QueryDefs 来更新表。只是一个查询对象或在 VBA CurrentDb.Execute 中。
  • 它正在使用 SELECT 并更新结果。当我添加视图时,它停止工作。我将其切换到当前的 UPDATE 语句。还是不行。今晚我会尝试删除视图,看看是否有任何改变。
  • 有没有可能VoidInProgressFlag可能有检查约束,而你通过VoidFlag传入的值不符合要求?
  • 不应将参数命名为字段名称 (TransactionID)。
  • @Gustav 已修复。

标签: sql-server ms-access odbc


【解决方案1】:

好的,第一个问题是您为什么/如何为参数选择“短”数据类型?

应该是:

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

您还声明,当您从 UI 运行此查询时,该查询有效。

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

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

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 的数据类型。

另外,检查左侧中殿窗格中的表名 - 是吗

dbo_tblTransaction

tblTransaction.

另外,在设计视图中打开链接表 - (忽略只读消息)。查看数据类型。您必须定义一个 PK - 所以检查一个 PK。

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

最后但并非最不重要? 如果查询仍然出错,那么您需要将时间戳(不是日期时间)添加到 sql server 表并重新链接。如果任何列是浮点数,这将/是必需的。

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

【讨论】:

  • 感谢您的精彩列表。我会解决的。显然是在感恩节之后。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多