使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表
Posted
技术标签:
【中文标题】使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表【英文标题】:Update SQL table with bigint field from VBA (MS Access) 【发布时间】:2009-06-24 20:46:19 【问题描述】:enter code here
我在 SQL Server 2005 上有一个带有 bigint 主键和 MS Access 2003 前端(链接表)的表。
我想更新以 bigint 作为主键的表的记录。 我用
CurentDb.execute _
"Update myTable SET Field1 =1 , Field2 = 'test' WHERE bigintKey = " & myVar
我得到标准表达式中的数据不匹配。
如何从 MS Access 更新具有 bigint 字段的 MS SQL 数据库中的记录?
编辑:当我这样做时它不会给我一个错误
CurentDb.execute _
"Update myTable SET Field1 =1 , Field2 = 'test' WHERE bigintKey = '" & _
myVar & "'"
但它不会更新记录...
【问题讨论】:
【参考方案1】:没有太多理由使用范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的主键值。
您最好将该主键更改为 sql 端的 int 列。如果您进行此更改,那么一切都会正常工作。我建议这样做。请记住,在 sql server 中,ms-access 中的 int = long。
尝试在 access 的表视图中打开链接表。我发现以 bigint 作为 PK 的 sql 2005 表甚至无法正确显示(您会在每一列中看到已删除)。
如果您删除 sql server 端的 PK 设置,我发现链接可以正常工作。换句话说,您可以拥有一个唯一索引并将其设置为递增(身份),但不要将其设置为 PK。从文档的角度来看这并不理想,并且如果在强制关系中有其他表,那么我不建议删除 PK 设置(实际上你不能这样做)。
所以,就目前而言,如果 PK 是 bigint,我将无法成功链接到 SQL Server 表。请注意,其他列作为 bigint 可以正常工作。它们被简单地链接为 ms-access 的文本数据类型。我看到您的代码示例正确地假设这将是一个文本列(这对您来说是正确的)。只有当 bigInt 是 PK 列时才会这样。
我会将 sql 端的 bigint 更改为 int(我只是看不出需要如此大规模的 pk)。如果您必须将列保留为 bigInt,则只需删除 sql 端的 PK 设置(如果可能的话)。
因此,您可以将该 bigInt 列作为唯一索引,并且它可以继续作为自动增量标识列。但是,它不能是 BigInt PK,那是行不通的。
【讨论】:
"请记住,在 sql server 中 a int = long in ms-access" -- 在 SQL DDL 中,并且 INTEGER(和同义词 INT)对于 SQL Server 和 Access 数据库引擎都是相同的。 LONG 是 INTEGER 的同义词,仅用于 Access 数据库引擎。 我说整数和长整数的问题是相等的,就 MS 访问而言。我根本没有提到 jet 或 jet DDL 语句。我只是说,当您在 MS 访问中谈论长值时,您通常在谈论 SQL Server 中的整数。这里的任何人都说整数对于 jet/sql server ddl 是相同的,这对任何人都没有帮助。然而,最重要的是向人们指出 MS 访问应用程序(代码等)中的长值是 SQL 服务器世界中的整数值。您似乎忘记了您可以构建访问应用程序而不使用 jet。 如果您的意思是 VBA6 或 MS Access 表设计器或其他任何东西,请具体说明。如果您只是说“MS Access”,那么这同样适用于 Access 数据库引擎,因此也适用于 SQL DLL。请注意,“Jet”专指 Access2007 之前的 Access 数据库引擎,而 SQL DDL 关键字适用于 Access 数据库引擎,这是 MS 用来统称 Jet 和 ACE 的术语。【参考方案2】:标准表达式中的数据不匹配通常意味着您的 SQL 语法错误。尝试将生成的 SQL 复制到 MS Access 中的新查询中并直接从 Access 运行。
在您的示例中,myVar 是什么?生成的 SQL 是什么?
【讨论】:
其实myVar是一个整数值。【参考方案3】:那么,您拥有作为 SQL Server 前端的 MS Access DB? 或 Access DB 是否已将表链接到 SQL Server?
运行 DML 语句后,通过查看 SQL Server(使用查询分析器)查看它是否更新了 SQL Server。我的猜测是,Access 可能不会刷新它。
【讨论】:
在这种情况下,您需要刷新/重新打开表才能查看生效的更新。如果 SQL 服务器显示数据已更新,则 Access 刷新数据有问题。以上是关于使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章
使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表
在 MS Access 中使用 VBA 查看 Combobox 中的唯一值
如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表