Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite-动态创建和更改数据库_C#_Database_Sqlite - Fatal编程技术网

C# SQLite-动态创建和更改数据库

C# SQLite-动态创建和更改数据库,c#,database,sqlite,C#,Database,Sqlite,今天,我使用SQLite并随项目发送一个数据库文件 但是,我希望在用户首次启动软件时创建数据库 是否有方法复制基于现有数据库创建数据库所需的代码?问题是,当用户下载一个新版本时,他可能会被骗复制上一个数据库并丢失数据。我想要一个很好的方法来检查数据库的版本,如果我需要新的列或表等来修改它。或者,如果它根本不存在,创建一个新的数据库 我知道我可以从一开始就编写代码来创建数据库,但我希望它基于我通过gui创建的现有数据库 回答。最终代码: //Copy the databas

今天,我使用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();
            }

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

好吧。。。我认为您可以在两个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');

问题不在于检查该做什么,我可以弄清楚。只需将数据库版本保存在数据库中。我想知道的是如何编写代码来执行更改?这取决于您如何记录更改以及您正在做什么。显然,您可以发出ALTERTABLE命令并添加/更新列。你只需要知道不同版本之间缺少什么,就可以知道你想要做什么。是的,这就是我所要求的。如何知道什么是不同的数据库,以及创建一个新的从scrach(基于我有一个)伟大!好主意,谢谢您的询问,非常有帮助。有些担心tho:我希望能够在没有数据库的情况下发布我的软件。这意味着我没有可比较的数据库,我无法使用您提供的代码创建数据库。我可能希望将数据库作为资源嵌入(这是否可行),然后将其复制到本地(如果不存在)。那我就可以和它比较了。有可能将db作为资源吗?当然可以,嵌入它,然后可以使用如下指令读取:GetType().Assembly.GetManifestResourceStream(“资源名称”);别忘了把编译动作放到“嵌入式资源”上,它的工作非常有魅力。检查问题中的“我的编辑”以获取最终代码。