程序退出时数据库不保存

时间:2017-05-18 11:56:51

标签: c# database winforms sqlite

我有以下代码,它从dataGridView读取所有数据,并且应该将其保存到数据库中。

private void datInp_Click(object sender, EventArgs e)
{
    SQLiteConnection con = new SQLiteConnection("Data Source=dBase1.sqlite;Version=3;");
    con.Open();
    SQLiteCommand sqlDatBas = new SQLiteCommand("INSERT INTO table1(column1,column2) VALUES (@c1,@c2)", con);
    for (int i = 0; i < dataGridView2.RowCount-1; i++)
    {
        sqlDatBas.Parameters.AddWithValue("@c1", dataGridView2.Rows[i].Cells[0].Value);
        sqlDatBas.Parameters.AddWithValue("@c2", dataGridView2.Rows[i].Cells[1].Value);
        sqlDatBas.ExecuteNonQuery();
    }
    con.Close();
    con.Dispose();
}

然而,每当我运行它,并使用程序显示数据库的当前状态时,它就会显示数据已保存,但是,如果我退出程序并再次运行它,它只显示基础数据库,没有新添加的数据。是因为我错过了一个专栏吗?由于表是使用ID创建的,但它应该自动增量。下面是表格的创建方式。

CREATE TABLE "table1" ("columnID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "column1" VARCHAR, "column2" VARCHAR)

在每次循环传递后,我总是使用ExecuteNonQuery(),因此所有数据都会添加到数据库中。我在dataGridView中显示数据库的当前状态,它显示添加的项目,但不是在我重新启动程序时。我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果在项目中包含数据库文件,请确保每次构建解决方案时都不将其复制到输出目录。如果这样做,存储在项目源文件中的数据库版本(在执行期间未被二进制文件修改)将覆盖输出目录中的数据库版本。

要更改此设置,请在解决方案资源管理器中和Properties -> Copy to output directory告诉VS Do not copy / Copy if newer下选择您的数据库文件。

如果您手动更改数据库并希望VS为您覆盖Output文件夹中的任何旧数据库,则第二个选项很有用。但是,我最终告诉VS永远不要复制它,我更喜欢自己控制复制。