升级WinForms SQLite数据库技术
我一直在研究数据库的升级程序,特别是SQLite类型的升级程序。
我被困在一个程序如何知道,“嘿……这个表不存在,让我们创建它!” 或“嘿,它确实存在,但它的三个版本落后,让我们更新它!”
我的意思是,我可以编写特定于每个表的每个版本的代码(基本上列出了应该包含哪些列…),然后将它全部转储到每个表的大量if语句或类似的东西,但那会疯了。 -`REALLY INSANE。
(我会包含那些代码,所以你们可以指出如何改进,但我已经知道这肯定不是正确的方法吗?)
– 实际使用什么技术来升级数据库?
我想详细说明:
a)检查表是否存在的最佳技术是什么?
b)程序如何知道表后面有多少个版本?
– 这适用于SQLite 3,用于桌面应用程序。
一种简单的方法是在数据库中有一个特殊的表。 我们假设这个特殊的表叫做DBVersion。 此表仅包含一行,其中包含一个包含数据库版本号的单个数字列。 最初此表包含值0
现在假设您有一个具有类似架构的XML文件
1 1 CREATE TABLE userTable ......
现在,您可以编写读取数据库DBVersion表编号的代码,然后加载XML文件,搜索版本值高于DBVersion表中版本号的命令并执行它们。 成功执行后,更新DBVersion表中的版本号。 (这里应特别注意避免错误,并且日志文件应该是必要的)。
int currentVersion = GetDBVersionNumber(); string scriptFile = "UPGRADE_DB.XML"; DataSet ds = new DataSet(); ds.ReadXml(scriptFile, XmlReadMode.ReadSchema); string filter = "Version > " + currentVersion.ToString(); string sort = "Version"; DataRow[] rows = ds.Tables[0].Select(filter, sort); if (rows.Length == 0) return; try { using(SQLiteConnection cnn = new SQLiteConnection(.....)) using(SQLiteCommand cmd = cnn.GetCommand()) { foreach (DataRow dr in rows) { cmd.CommandText = dr.Field("Command"); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); UpdateDBVersionNumber(dr.Field("Version")); WriteLog(currentVersion); } } } catch(Exception ex) { WriteLog(ex); }
当您需要升级数据库时,只需将另一个“记录”添加到XML文件并将其分发给您的客户。 应用程序应该能够在不对代码进行任何更改的情况下升级数据库以实现此特定目的
最广泛使用的方式是Android使用的方法:这是使用SQLiteOpenHelper类处理的, 该类在数据库中存储版本号(使用PRAGMA user_version ,但确切的机制无关紧要)并且对应用程序具有onCreate
/ onUpdate
回调处理这些案件。
您不需要检查单个表格; 数据库版本号负责处理。 (您可以通过将整个更新放入事务中来保持一致。)
查看源代码 (尤其是getDatabaseLocked
)并实现类似的function。
当您有多个旧版本时,处理此问题的典型方法如下:
if (oldVersion < 2) { // update everything from version 1 to 2 } if (oldVersion < 3) { // update everything from version 2 to 3 } ...