重新打开程序后未加载C#sqlite

时间:2018-09-11 19:23:30

标签: c# database visual-studio sqlite system.data.sqlite

我有一个用c#编写的简单程序,我正在使用SQLite保存配置文件列表(电子邮件,密码)。一切正常,直到我关闭程序,然后重新打开它。当我这样做时,表是空的。这段代码位于我的窗体构造函数中,该窗体构造函数在程序加载时首先触发(这是单个窗体程序,非常基本)。我正在使用 System.Data.SQLite 库。我可以在我的项目文件夹(bin / debug / ..)中看到该文件。谁能解释为什么这些信息没有保存并可以在重新打开程序时阅读?

SQLiteConnection.CreateFile("MyDatabase.db");
m_dbConnection = new SQLiteConnection("Data Source=MyDatabase.db;Version=3;");
m_dbConnection.Open();
string sql = "CREATE TABLE " + profileTable + " (" + emailCol + " VARCHAR(320), " + passwordCol + " VARCHAR(30))";
SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection);
command.ExecuteNonQuery();
sql = "SELECT * FROM "+profileTable+" order by "+emailCol+" desc";
command = new SQLiteCommand(sql, m_dbConnection);
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    emailProfileListBox.Items.Add(reader[emailCol] as String);
}

这是我的INSERT语句,它确实插入并已通过验证。

string sql1 = "INSERT INTO "+profileTable+" ("+emailCol+", "+passwordCol+") VALUES (\'"+from_email_address.Text+"\', \'"+passwordTextBox.Text+"\')";
SQLiteCommand command1 = new SQLiteCommand(sql1, m_dbConnection);
command1.ExecuteNonQuery();

2 个答案:

答案 0 :(得分:1)

第一行,如果每次运行都创建一个新文件,该文件将被覆盖。

SQLiteConnection.CreateFile("MyDatabase.db");

将创建语句包装在if块中,而不是检查文件是否在磁盘上。

if (!System.IO.File.Exists("MyDatabase.db")) 
{
   SQLiteConnection.CreateFile("MyDatabase.db");
   // continue your creation script here
}

请参见documentation

  

在指定路径中创建或覆盖数据库文件。这只是创建一个零字节文件,当正确打开文件时,SQLite会将其转换为数据库。请注意,现有文件将被覆盖。


旁注

  • 您还应该将连接和该类型在IDisposable块中实现using的所有其他实例包装起来,以确保始终释放外部资源。
  • 对于传递给它们的任何值,都应使用参数化语句。因此,您选择的插入内容,更新内容和条件应使用参数传递值。
  • 从不存储密码,甚至不存储加密密码。创建密码的单向盐化哈希,然后进行存储。那里有许多现有的库/代码碎片可以为您做到这一点。

答案 1 :(得分:0)

是因为重新运行程序时正在创建表吗?