【问题标题】:SQLite - Creating and changing databases on the flySQLite - 动态创建和更改数据库
【发布时间】:2010-04-15 16:00:56
【问题描述】:

今天我使用 SQLite 并随项目发送一个数据库文件。

但是我希望在用户首次启动软件时创建数据库。

有没有办法复制基于现有数据库创建数据库所需的代码?问题是当用户下载一个新版本时,他可能会被骗复制他的最后一个数据库并丢失数据。如果我需要新的列或表等,我想要一个检查数据库版本并修改它的好方法。或者,如果它根本不存在,创建一个新数据库?

我知道我可能可以从一开始就创建创建数据库的代码,但我希望它基于我通过 gui 创建的现有数据库。

已回答。最终代码:

            //Copy the database from the resource
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("resourcename"))
            {
                if (stream == null)
                    throw new NullReferenceException("Stream is null. Cannot find the database in the resources");
                FileStream writer = new FileStream(Constants.SqLiteFile, FileMode.Create);
                int Length = 256;
                Byte[] buffer = new Byte[Length];
                int bytesRead = stream.Read(buffer, 0, Length);
                // write the required bytes
                while (bytesRead > 0)
                {
                    writer.Write(buffer, 0, bytesRead);
                    bytesRead = stream.Read(buffer, 0, Length);
                }
                stream.Close();
                writer.Close();
            }

【问题讨论】:

    标签: c# database sqlite


    【解决方案1】:

    嗯...我认为您可以在两个 sqlite 数据库之间进行同步,我的想法是获取每个数据库的表和字段,然后遍历它们以查看哪些表和字段在一个而不是在一个另一个。

    首先,这些查询可能对您有用。

    -- For getting tables in current db
    SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
    
    -- For getting info about a table
    PRAGMA table_info('tabla_name');
    

    【讨论】:

    • 太棒了!好主意,感谢您的询问,最有帮助。一些担忧:我希望能够在没有数据库的情况下发布我的软件。这意味着我没有可比较的数据库,也无法使用您提供的代码创建数据库。我可能想将数据库作为资源嵌入(这可能),然后如果不存在则将其复制到本地。然后我可以和它进行比较。是否可以将数据库作为资源?
    • 当然可以,嵌入它,然后您可以使用如下指令读取它:GetType().Assembly.GetManifestResourceStream("name of resource");
    • 别忘了把编译动作放到“嵌入式资源”
    • 工作就像一个魅力。检查我在问题中的编辑以获取最终代码。
    【解决方案2】:

    听起来您只需要一个位置来保存他们当前系统的版本。创建一个配置表并有一个记录来维护创建/更新数据库的任何版本。当他们运行安装程序/升级时,让它检查该版本以查看它是否存在,和/或使用什么版本来确定要采取的步骤。

    【讨论】:

    • 问题不在于检查该做什么,我可以弄清楚。只需将数据库版本保存在数据库中即可。我想知道的是如何编写代码来执行更改?
    • 这取决于您如何记录更改以及您在做什么。显然,您可以发出 ALTER TABLE 命令并添加/更新列。你只需要知道版本之间缺少什么就知道你想做什么。
    • 是的,这基本上就是我所要求的。如何知道与数据库有什么不同以及从头开始创建一个新的(基于我拥有的)
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多