为什么无法访问更新 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 修复了它。
访问前端,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 修复了它。