显示为#DELETED的行

时间:2012-03-12 00:37:07

标签: sql-server ms-access

我在使用Access时在一台计算机上显示为 #DELETED 的表中有数据行,但它们在SQL数据库和使用Access的其他计算机上都很好。它似乎只是最近的200行。 Access 2007版本和ODBC MSJet驱动程序看起来是相同的&每台电脑上最新的。一个建议是将任何PK或FK改为int,但它们已经是。

有什么想法可以解决这个问题吗?

10 个答案:

答案 0 :(得分:10)

当表主键值超出MS Access支持的范围时,通常如果您在SQL Server中使用“BigInt”类型,如果您只是想要读取数据然后创建“快照”,则会发生这种情况。镜头“查询表格,所有行都会正确显示,因为”快照“不需要读取所有索引。

如果您需要随时更新这些行中的数据,我建议您改用ADO记录集。

答案 1 :(得分:4)

考虑在SQL中使用数字(18,0)而不是 bigint 作为主键数据类型。如果在SQL Server端将其设置为数字数据类型,则MS Access可以解析有效的大整数PK。我在使用Access 2010的SQL 2008R2上遇到了同样的问题,其中所有行在使用bigint PK时都显示为“#DELETED”。

答案 2 :(得分:3)

我已经将Access前端连接到SQL Server 2000,2008 R2然后连续2014年没有问题。在硬盘发生故障后,我在Windows 7(64位)计算机上重新安装了SQL Server 2014 Developer,突然我的Access 2010表单在移动到新记录或单击功能区上的“保存”时,在每个字段中都获得了可怕的#Deleted。

这很奇怪,因为在另一台计算机上安装相同的Windows 7(64位)没有问题。好吧,几乎完全相同。在新硬盘上安装SQL Server 2014后,我发现只安装了Native Client 11.0驱动程序,因此我修改了ODBC连接字符串,以便在我的Access VBA代码中使用DRIVER = SQL Server Native Client 11.0。当使用Access表单时,我立即开始在插入记录的每个字段中获取#Deleted。

调查显示了“好”和“好”之间的区别。正确处理插入记录的计算机,以及“坏”的计算机。得到#Deleted的计算机是Native Client 10.0驱动程序的存在与否。我从Microsoft下载了10.0驱动程序,安装了它并检查了我的代码以确保所有ODBC连接字符串都使用了DRIVER = SQL Server Native Client 10.0。

现在一切正常,没有#Deleted问题。

答案 3 :(得分:2)

好吧,只想添加适合我的解决方案。

我将一些视图链接到MS Access,这些工作正常。过了一段时间后,我改变了之前是Integer的一个列的类型,然后我做了VARCHAR。由于此列是我的表的主键(我在MS Access中添加View时也选择了主键),因此在更改后它开始显示“#DELETED”。要解决此问题,我只是使用“ALTER VIEW”语句重新执行了相同的视图,并使用了sp_refreshview'VIEW_NAME'。

这样做之后就开始为我工作了。 希望这可以帮助遇到同样问题的人。

答案 4 :(得分:2)

我遇到了相同的#DELETED问题,原因是主键数据类型为 bigint 。当我查询由第三方应用程序创建的表时,我无法修改数据类型,因此我在表上创建了一个视图,并使用CAST将数据类型转换为 int (之后)检查表中保存的值是否会导致溢出。)

答案 5 :(得分:2)

如果在SQL使用ROW_NUMBER()函数的字段上设置主键,则可以将其强制转换为int。默认情况下,ROW_NUMBER()是int64(bigInt)。

答案 6 :(得分:1)

指向访问SQL 2017数据库(以前指向SQL 2008R2数据库)时会发生这种奇怪的行为。当我们使用更新的ODBC驱动程序(SQL Native Client 11)创建新的DSN时,行为恢复正常。

答案 7 :(得分:1)

在较新版本的Access上,有一个选项支持BigInt数据类型。

File > Options > Current Database > Data Type Support Options

应用该选项,然后刷新表格。

Access Support BigInt

答案 8 :(得分:0)

我有一个奇怪的情况,查询返回的数据是#Deleted,但是我会第二次运行(刷新查询中的结果),并且数据是正确的……有时。然后,我将查询结果写到表中以查看是否有帮助,并实际写入了数据,但包含指向其他表的外键(int(11))的行返回零作为值。设置了访问中的BigInt配置(并且在odbc驱动程序中,设置了将bigint绑定为字符串的检查-这是以前安装的习惯)。

经过大量阅读和混乱,我决定卸载ODBC 5.03.13驱动程序并尝试使用旧版本。我碰巧安装了一个5.03.04下载的msi,并且我的数据库按预期工作。奇怪的解决方案,我不知道为什么现在可以解决,但是这花了我一天的时间!我想分享一下,希望这个解决方案可能对某人有帮助,以防万一关于该主题的所有其他建议都用尽(如我所做的那样)。

答案 9 :(得分:0)

如果要从SQL上的Views链接表,则由于ROW_NUMBER()是bigint,MS Access将显示#Deleted,但是如果刷新一行,则它将显示值。为了克服这个问题,您可以使用强制转换。例如

CAST((Row_number() OVER(ORDER BY AllColumns.AnyColumnNameSuchAsDateColumn DESC)) AS INT) AS 'id', AllColumns.* FROM (SELECT AnyColumnNameSuchAsDateColumn, ...etc FROM YourTableName WHERE YourCondition) AS AllColumns