我的SQLite数据库出现问题。我使用的是http://www.ch-werner.de/sqliteodbc/的SQLite ODBC已安装64位版本并使用以下设置创建ODBC:
我打开Access数据库并链接到数据源。我可以打开表、添加记录,但不能删除或编辑任何记录。是否需要在ODBC端修复某些问题才能允许这样做?尝试删除记录时出现的错误是:
Microsoft Access数据库引擎已停止该进程,因为您和另一个用户正试图同时更改同一数据。
当我编辑记录时,我得到:
自您开始编辑记录后,其他使用者已变更记录。如果您保存记录,将会覆写其他使用者所做的变更。
已禁用保存记录。只能复制到剪贴板或放下更改。
4条答案
按热度按时间vcirk6k61#
我最初尝试重新创建您的问题失败。我在我的32位测试VM上使用了以下代码:
我创建并填充了测试表[tbl1],并记录为here。我创建了一个Access链接表,并在出现提示时选择了两列([one]和[two])作为主键。当我在“数据表视图”中打开链接表时,我可以添加、编辑和删除记录,而不会发生意外。
我可以看到我的设置和您的设置之间的唯一区别(除了我使用的是32位而您使用的是64位这一事实之外)是,在ODBC DSN设置中,我将
Sync.Mode
设置保留为默认值NORMAL
,而您的设置似乎设置为OFF
。尝试将您的
Sync.Mode
设置为NORMAL
,看看是否会有不同。编辑回复:注解
这种情况下的解决方案如下:
一种可能的解决方法是创建一个新的SQLite表,该表包含所有相同的列以及一个新的INTEGER PRIMARY KEY列,Access将“看到”该列作为AutoNumber。您可以在(当前的)前四列上创建一个唯一索引,以确保它们保持唯一性,但Access将使用新的“标识”(ROWID)列来标识CRUD操作的行。
polkgigr2#
我也遇到过这个问题。我有一个表的主键在VARCHAR(30)(TEXT)字段上。
添加INTEGER PRIMARY KEY列根本没有帮助。经过大量测试后,我发现问题出在表中的DATETIME字段上。我删除了DATETIME字段,并能够在MS-Access数据表视图中更新记录值。
现在,我在SQLite中需要的任何DATETIME字段,我都声明为VARCHAR(19),这样它们就可以通过ODBC以文本的形式进入Access。虽然不完美,但它可以工作。(当然,SQLite没有真正的DATETIME字段类型,所以TEXT就可以了,可以转换为OK)
我确认这是一个数字转换问题。如果DATETIME字段为空,我可以通过Access的数据表视图添加时间01 - 01 - 2014 12:01:02,如果我在SQLite中查看该值,则秒数已四舍五入:
SYNCMODE也应该是NORMAL而不是OFF。
nwo49xxi3#
我搜索了所有类似的帖子,因为我在通过ODBC链接到Access的SQLite中遇到了类似的问题。我有三个表,其中两个允许编辑,但第三个不允许。第三个表有一个DATETIME字段,当我将原始SQLite数据库中的数据类型更改为TEXT字段并重新链接到Access时,我可以编辑该表。所以对我来说,这被确认为DATETIME字段的问题。
ccrfmcuu4#
在遇到这个问题后,没有找到满意的答案,并且浪费了大量时间尝试其他解决方案,我最终发现其他人提到的关于DATETIME字段的内容是准确的,但是存在另一种解决方案,可以让您保持正确的数据类型。SQLite ODBC驱动程序可以通过在列中查找浮点值,将儒略日值转换为ODBC SQL_TIMESTAMP / SQL_TYPE_TIMESTAMP类型,如果您在驱动程序中启用了该选项,则可以使用该选项。以这种方式存储日期可以使ODBC时间戳值具有足够的精度,以避免写入冲突错误,同时还可以使Access将该列视为日期/时间字段。
甚至在日期字符串中存储亚秒精度也不起作用,这可能是驱动程序中的一个错误,因为生成的TIMESTAMP_STRUCT包含相同的值,但小数秒必须在其他位置丢失。