首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >升级WinForms SQLite数据库技术

升级WinForms SQLite数据库技术
EN

Stack Overflow用户
提问于 2014-08-01 22:21:12
回答 2查看 468关注 0票数 2

我一直在研究数据库的升级过程,特别是那些SQLite类型的数据库。

我不知道程序是如何知道的,"Hey..this表不存在,让我们创建它!“或者“嘿,它确实存在,但它的三个版本后面,让我们更新它!”

我的意思是,我可以为每个表的每个版本编写特定的代码(基本上是列出表中应该包含哪些列.),然后将其全部转储到每个表的大量if语句或诸如此类的愚蠢的语句中,但这将是疯狂的。-`REALLY疯了。

(我会把代码包括在内,这样你们就可以指出如何改进,但我已经知道,这肯定不是正确的方法吗?)

-What技术实际上是用来升级数据库的?

我想要具体的细节:

(A)检查表是否存在的最佳技术是什么?

(B)程序如何知道一个表背后的版本是多少?

-This用于SQLite 3,用于桌面应用程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-01 22:50:15

一种简单的方法是在数据库中有一个特殊的表。让我们假设这个特殊的表称为DBVersion。此表仅包含一个包含数据库版本号的单个数字列的行。最初,此表包含值0。

现在假设您有一个具有类似模式的XML文件。

代码语言:javascript
复制
<?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文件,搜索具有高于DBVersion表中版本号的命令,并执行这些命令。成功执行后,更新DBVersion表中的版本号。(这里应该特别注意避免错误,日志文件应该是必需的)。

代码语言:javascript
复制
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文件中,并将其分发给客户。应用程序应该能够升级数据库,而无需为此目的对代码进行任何更改。

票数 1
EN

Stack Overflow用户

发布于 2014-08-02 08:28:50

使用最广泛的方法是Android:这是由SQLiteOpenHelper类处理的,它在数据库中存储版本号(使用版本,但确切的机制并不重要),并为应用程序进行onCreate/onUpdate回调以处理这些情况。

您不需要检查单个表;数据库版本号负责处理这个问题。(通过将整个更新放入事务中,可以保持所有内容的一致性。)

看看来源 (特别是getDatabaseLocked),并实现类似的东西。

当您有多个旧版本时,处理此问题的典型方法如下所示:

代码语言:javascript
复制
if (oldVersion < 2)
{
    // update everything from version 1 to 2
}
if (oldVersion < 3)
{
    // update everything from version 2 to 3
}
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25089540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档