代码之家  ›  专栏  ›  技术社区  ›  Oskar Kjellin

sqlite-动态创建和更改数据库

  •  2
  • Oskar Kjellin  · 技术社区  · 15 年前

    今天我使用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();
                }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Jhonny D. Cano -Leftware-    15 年前

    好。。。我想你可以在两个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');
    
        2
  •  0
  •   Thyamine    15 年前

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