2011-03-22 27 views
1

我的团队以前使用Qt 4.3并试图更新到最新版本(4.7.2)。QSqlite变化

在我们使用qsqlite插件之前,这个功能已经被转移到了Qt的主要QSql组件中。

现在我们已经升级了,我们无法阅读我们的旧数据库。这似乎是因为当我们创建了我们的桌子,我们创造了他们这样的:

CREATE TABLE [Characters] ([Id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT UNIQUE ON CONFLICT ROLLBACK, [Project_Id] INTEGER NOT NULL ON CONFLICT ROLLBACK REFERENCES [Projects](Id) ON DELETE RESTRICT ON UPDATE RESTRICT ON INSERT RESTRICT, [CharacterName] VARCHAR(128) NOT NULL ON CONFLICT ROLLBACK UNIQUE ON CONFLICT ROLLBACK); 

ON INSERT RESTRICT不再有效。

我能够删除该代码并创建新表,但如果我在其中一个现有DB上执行myQSqlDatabase.tables(),则它将返回零。

我注意到通过挖入Qt代码,该制备方法具有:

#if (SQLITE_VERSION_NUMBER >= 3003011) 
    int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0); 
#else 
    int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0); 
#endif 

和我们正在进入如果第一(sqlite3_prepare16_v2)。

我们应该在什么地方定义SQLITE_VERSION_NUMBER更低?是否还有其他的我们做错了,以防止向后兼容?

任何帮助,将不胜感激。

感谢,作为从作者的网站下载 Liron

回答

1

源码带有一个命令行程序。 如果您的数据库不兼容,您可以轻松使用它将数据导出到文本文件并将其加载到新数据库中。

+0

对我们来说不是一个真正的选择 - 应用程序是分布式的,并且有很多数据库副本。我们必须确保我们可以在没有任何问题的情况下读取旧的数据库。 – Liron 2011-03-22 20:03:53

+0

我只是试过这个测试:把我的旧数据库,用sqlite.exe读入并转储到一个文本文件。从该文本文件创建一个新的数据库。然后将其作为文本文件转储出来,它们是相同的(如预期的那样)。这似乎是问题与Qt代码本身,而不是与sqlite代码。 – Liron 2011-03-22 21:04:40

+0

选定的答案,因为没有人评论。 Qt代码中的问题从来没有真正解决,但我们解决了这个问题。 – Liron 2012-08-01 15:35:41