我一直在研究数据库的升级过程,特别是SQLite类型的数据库。
我被程序如何知道的困扰,“嘿。这个表不存在,让我们创建它吧!” 或“嘿,它确实存在,但后面有三个版本,让我们对其进行更新!”
我的意思是,我可以为每个表的每个版本编写特定的代码(基本上列出了其中的哪些列…),然后将其全部转储到每个表的大型if语句中,或类似的傻事,但这会疯了。-真的很疯狂。
(我会包含该代码,以便你们指出如何进行改进,但是我已经知道这肯定不是正确的方法吗?)
-实际使用什么技术升级数据库?
我想要特定的细节:
a)检查表是否存在的最佳技术是什么?
b)程序如何知道一个表后面有多少个版本?
-这是用于桌面应用程序中的SQLite 3。
一种简单的方法是在数据库中有一个特殊的表。假设此特殊表称为DBVersion。该表仅包含一行,其中一个数字列包含数据库的版本号。最初,该表包含值0
现在假设您有一个具有类似架构的XML文件
<?xml version="1.0" standalone="yes"?> <DatabaseUpdater> <xs:schema id="DatabaseUpdater" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="DatabaseUpdater" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="UpdateCMD"> <xs:complexType> <xs:sequence> <xs:element name="DBType" type="xs:int" minOccurs="0" /> <xs:element name="Version" type="xs:int" minOccurs="0" /> <xs:element name="Command" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <UpdateCMD> <DBType>1</DBType> <Version>1</Version> <Command>CREATE TABLE userTable ...... </Command> </UpdateCMD> </DatabaseUpdater>
现在,您可以编写代码来读取数据库DBVersion表号,然后加载XML文件,搜索Version值高于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<string>("Command"); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); UpdateDBVersionNumber(dr.Field<int>("Version")); WriteLog(currentVersion); } } } catch(Exception ex) { WriteLog(ex); }
当您需要升级数据库时,只需在XML文件中添加另一个“记录”,然后将其分发给您的客户即可。该应用程序应该能够升级数据库,而无需为此目的而对您的代码进行任何更改