我有以下代码,它从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中显示数据库的当前状态,它显示添加的项目,但不是在我重新启动程序时。我错过了什么?
答案 0 :(得分:1)
如果在项目中包含数据库文件,请确保每次构建解决方案时都不将其复制到输出目录。如果这样做,存储在项目源文件中的数据库版本(在执行期间未被二进制文件修改)将覆盖输出目录中的数据库版本。
要更改此设置,请在解决方案资源管理器中和Properties -> Copy to output directory
告诉VS Do not copy / Copy if newer
下选择您的数据库文件。
如果您手动更改数据库并希望VS为您覆盖Output文件夹中的任何旧数据库,则第二个选项很有用。但是,我最终告诉VS永远不要复制它,我更喜欢自己控制复制。