2013-10-29 143 views
11

我遇到了SQLite数据库的问题。我使用SQLite的ODBC从http://www.ch-werner.de/sqliteodbc/安装了64位版本,并创建了这些设置ODBC:通过Access中的ODBC链接表更新SQLite数据库

enter image description here

我打开Access数据库,并链接到数据源。我可以打开表格,添加记录,但不能删除或编辑任何记录。有什么我需要修复的ODBC端允许这一点?我尝试删除记录时遇到的错误是:

由于您和另一用户正在尝试同时更改相同的数据,Microsoft Access数据库引擎停止了此过程。

当我编辑记录,我得到:

的记录已被其他用户自您启动编辑它被改变。如果保存记录,则会覆盖其他用户所做的更改。

保存记录被禁用。只有复制到剪贴板或删除更改可用。

+0

在另一个论坛[这里]有一个类似的问题(http://social.msdn.microsoft.com/Forums/office/en-US/85196e70-d77f-4aef-af3f-78e43570f54a/editing-records-in -a-sqlite的-后端-DB?论坛= accessdev)。这些答案或建议是否有帮助? –

+0

@GordThompson添加时间戳字段似乎工作。不过,我需要清理桌子。唯一的记录访问可以改变,但通过访问添加的记录。我已经添加了一条记录,尽管SQLite Expert Personal Edition和Access无法更改或删除这些记录。 – Herrozerro

+0

添加一个链接到这个相关的问题:http://stackoverflow.com/questions/22837151/sqlite-linked-tables-in-access-give-deleted-values-again – gwideman

回答

9

我最初尝试重新创建问题不成功。我用我的32位测试VM如下:

  • 访问2010
  • SQLite的3.8.2
  • SQLite的ODBC驱动程序0.996

我创建并填充测试表[TBL1]如文件here所述。我创建了一个Access链接表,当提示时我选择了两个列([one]和[two])作为主键。当我打开数据表视图中的链接表时,我能够无故地添加,编辑和删除记录。

我可以看到我的设置和你之间唯一的区别(除了我在32位上,而你在64位上)的事实是,在ODBC DSN设置中,我将Sync.Mode设置保留为默认设置值为NORMAL,而您的值似乎设置为OFF

尝试将您的Sync.Mode设置为NORMAL,看看是否有所作为。

编辑回复:评论

在这种情况下的解决方案是以下几点:

一个可能的解决方法是创建一个新的SQLite表的所有相同的列加一个新的INTEGER PRIMARY其中Access将“看到”作为自动编号的KEY列。您可以在前四列创建一个唯一的索引(确保当前),以确保它们保持唯一性,但是新的“标识”(ROWID)列是Access用来标识CRUD操作的行的列。

+0

是否有可能使用另一个程序添加记录像http://www.sqliteexpert.com/?我的问题似乎是当您尝试编辑未被访问添加的记录时。如果我通过访问添加了记录,那么使用Timestamp字段可以正常工作,但通过其他来源添加记录似乎也有同样的问题。 – Herrozerro

+0

@Herrozerro我使用SQLite本身创建了表中的前两条记录(按照[这里](http://www.sqlite.org/sqlite.html)),我能够编辑和删除其中的一条记录。如果你有一个可以通过[wikisend.com](http://wikisend.com)(或类似的)共享的小样本SQLite文件,我可以看到它对我的行为是否有所不同。 –

+0

这里是我的文件的链接。 https://www.dropbox.com/s/2o68md7fd1vvr7b/qaqc.sqlite – Herrozerro

4

我也有这个问题。我有一个VARCHAR(30)(TEXT)字段上的主键的表。

添加一个INTEGER PRIMARY KEY列完全没有帮助。经过大量测试后,我发现问题出在我在表格中的DATETIME字段中。我删除了DATETIME字段,并且能够在MS-Access数据表视图中更新记录值。

因此,现在我需要在SQLite中的任何DATETIME字段,我声明为VARCHAR(19),所以他们有一些通过ODBC访问作为文本。不完美,但它的作品。 (当然,SQLite没有真正的DATETIME字段类型,所以TEXT就好了,将转换成OK)

我确认这是一个数字转换问题。随着空DATETIME场,我可以通过访问的数据表视图中添加的2014年1月1日12:01:02时,如果我再看看在SQLite的价值秒已经四舍五入:

sqlite> SELECT three from TEST where FLoc='1020'; 
2014-01-01 12:01:00.000 

SYNCMODE也应该是NORMAL而不是OFF。

更新: 如果有具有限定的长度的任何文本字段(例如FOO VARCHAR(10))和字段内容包含比字段定义多个字符(其SQLite的允许)MS-Access将也BARF时试图更新该行上的字段的任何

+0

我有同样的问题,D.Peters解决方法工作。从DATETIME切换到VARCHAR(19)是解决方案。非常感谢。 – cetipabo

0

我已经搜索了所有类似的帖子,因为我有一个SQLite通过ODBC链接到Access的类似问题。我有三张桌子,其中两张允许编辑,但是第三张没有。第三个有DATETIME字段,当我将数据类型更改为原始SQLite数据库中的TEXT字段并重新链接到访问时,我可以编辑该表。所以对我来说,它被确认为DATETIME字段的问题。

相关问题