我在Oracle 12c中创建了一个简单的表,如下所示:
CREATE TABLE TEST
(
ID NUMBER GENERATED ALWAYS AS IDENTITY,
TEXT VARCHAR2(2000 CHAR),
CONSTRAINT ID_PK PRIMARY KEY (ID)
);
然后我在MS Access中使用ODBC驱动程序链接它。问题是,当我输入值到文本中并单击离开时,ID和文本都显示#已删除。我的值会记录在数据库中,但我必须在MS Access中重新查询才能看到它。
我还注意到如果我把文本字段的数据类型改为数字,它工作正常。在MS Access中保存记录后,文本字段中自动生成的ID和值都在那里。我不需要重新查询任何东西。
这种情况只在插入时发生。更新工作正常。
请指示。
2条答案
按热度按时间iqjalb3h1#
因此,看起来您已经找到了解决方案,但这更多的是解释为什么它是这样工作的。简单地说,如果基表使用非整数值作为主键,Access会将这些整数四舍五入到最接近的整数,然后(因为它不是数值)Access无法再找到适用的记录。因此,在表结构中将数据类型从
TEXT
更改为INTEGER
将给予所需的结果。或者,如果您使用查询来遍历这些数据,如果您无法更改Oracle表中的键,则将Access查询类型更改为快照(在查询属性中)也可以绕过此问题,但从声音上看,这不是您使用数据的方式。
w8biq8rn2#
在我的例子中,Oracle ODBC驱动程序(使用相当旧的版本11.02.00.01,否则可以正常工作,以及Microsoft Access 2016 32位)似乎使用唯一索引,而不是主键约束来确定主键。
我有一个以
NUMBER(11)
作为PK的字段,它有一个唯一索引,然后添加了一个具有另一个唯一索引的VARCHAR2
字段,VARCHAR2
字段的索引名称按字母顺序排在NUMBER
字段的索引名称之前。现在,Microsoft Access中的链接表将
VARCHAR2
字段显示为主键,我遇到了输入并保存记录后出现“#Deleted”的问题,如您所述。在Oracle中重命名
NUMBER
字段上的唯一索引,使其按字母顺序排在VARCHAR2
字段之前,并在Microsoft Access中重新链接该表后,NUMBER
字段再次成为Microsoft Access中的主键,“#Deleted”问题得到解决。