我编写了一个简单的应用程序(称其为app1),它读取SQLite数据库并在网格视图中显示内容。我有一个单独的C#控制台应用程序(app2),需要写入相同的数据库。问题是,app2会出现“数据库已锁定”的错误。我发现只要启动app1就会创建一个userdb-journal文件。我认为问题是app1打开了数据库但没有释放它?这是我在app1中为填充绑定到网格的表所拥有的代码。
我该如何解决让 app2 在 app1 运行时也能读写数据库的问题? 编辑 看起来日志文件只有 app2 创建。当 app1 也在运行时,我只注意到了数据库锁定错误,但 app1 可能是一个红鲱鱼。App2 是多线程的。也许我应该开一个新的问题,专注于 app2 和多线程访问? 编辑 感谢所有评论。我已经在所有数据库访问周围加了锁,并将所有内容包装在 usings 中。现在似乎一切都正常了。
public DataTable GetAllPeople()
{
var connectionString = "Data Source=" + dbPath + ";Version=3";
using (SQLiteDataAdapter sqlDataAdapter =
new SQLiteDataAdapter("SELECT id,FirstName,LastName,Address FROM Users",
connectionString))
{
using (DataTable dataTable = new DataTable())
{
sqlDataAdapter.Fill(dataTable);
// code to add some new columns here
return dataTable;
}
}
}
这是填充网格视图的代码:
private void Form1_Load(object sender, EventArgs e)
{
UserDatabase db = new UserDatabase();
db.Initialize();
dataGridView1.DataSource = db.GetAllPeople();
}
我该如何解决让 app2 在 app1 运行时也能读写数据库的问题? 编辑 看起来日志文件只有 app2 创建。当 app1 也在运行时,我只注意到了数据库锁定错误,但 app1 可能是一个红鲱鱼。App2 是多线程的。也许我应该开一个新的问题,专注于 app2 和多线程访问? 编辑 感谢所有评论。我已经在所有数据库访问周围加了锁,并将所有内容包装在 usings 中。现在似乎一切都正常了。
GetAllPeople
仅从数据库中读取数据,因此它可能只会短暂地获取一个共享锁,然后返回。您确定您的app1没有向数据库中写入数据吗? - vgru