以下函数用于我的应用程序的较新版本,需要将列添加到现有数据库。
Child2
执行此操作时会出现异常
数据库被锁定
堆栈跟踪
public void AddColumnIfNotexist()
{
try
{
using (SQLiteCommand cmd = _DBConnection.CreateCommand())
{
cmd.CommandText = string.Format("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'myTable'");
bool hascol = false;
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
//does column exists?
hascol = reader.GetString(0).Contains(String.Format("\"{0}\"", "myNewColumn"));
reader.Close();
}
}
if (!hascol)
{
StringBuilder sql = new StringBuilder(SQLMAXLENGTH);
sql.Append("ALTER TABLE Groups ADD COLUMN IsStayingRatio BIT NOT NULL DEFAULT 0");
cmd.CommandText = sql.ToString();
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\r\n\r\n" + ex.StackTrace);
LogApp.Write("Exception ex:" + ex.Message +"stacktrace "+ex.StackTrace, LogApp.Level.Error);
}
}
}
但这并不总是发生。如果DB Fil的大小很大,就会发生这种情况。此外,从IDE调试时问题不存在。
Alter Table查询是否有任何限制? 任何人都可以发现导致数据库锁定的问题吗?
答案 0 :(得分:1)
我建议开始新的gcloud config set project <projectID>
请注意,SQLITE_LOCKED错误与SQLITE_BUSY(5)不同。 SQLITE_BUSY表示另一个数据库连接(可能在 另一个进程)以阻止你的方式使用数据库 使用它。 SQLITE_LOCKED表示争用的来源是内部和 来自接收到的相同数据库连接 SQLITE_LOCKED错误。
有时候人们认为他们已经完成了SELECT语句,因为sqlite3_step()已经返回了SQLITE_DONE。但是,在调用sqlite3_reset()或sqlite3_finalize()之后,SELECT才真正完成
答案 1 :(得分:1)
在reader.Close()
为我工作后添加以下行。
GC.Collect();
GC.WaitForPendingFinalizers();
似乎在执行ALTER查询时未释放数据库。 得到here的提示。