[英]Getting 'unable to open database file' with sqlite running under mono
我第一次發帖。
我制作了一個在后台運行的控制台應用程序,它是用C#編寫的,並且我正在使用sqlite3來存儲其信息。 它在單聲道下運行,但是運行幾天后卻unable to open database file
。 重新啟動應用程序即可解決問題,但幾天后它將給我同樣的錯誤。
我懷疑是關閉后連接沒有被釋放,所以我在connection.close()之后添加了釋放,但是仍然收到相同的錯誤。 我也做了一些搜索,發現這個線程也有類似的問題,我做了他說的話,但仍然遇到相同的錯誤。
任何幫助將不勝感激。
對不起英語不好
更新:我的代碼
private static void ExecuteNonQuery(string query)
{
if (isrunningundermono == true)
{
SqliteConnection sqlcon = new SqliteConnection(ConfigurationManager.AppSettings["connectionString"]);
SqliteCommand sqlcmd;
sqlcon.Open();
sqlcmd = sqlcon.CreateCommand();
sqlcmd.CommandText = query;
sqlcmd.ExecuteNonQuery();
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
}
else
{
SQLiteConnection sqlcon = new SQLiteConnection(ConfigurationManager.AppSettings["connectionString"]);
SQLiteCommand sqlcmd;
sqlcon.Open();
sqlcmd = sqlcon.CreateCommand();
sqlcmd.CommandText = query;
sqlcmd.ExecuteNonQuery();
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
}
}
private static int ExecuteScalar(string query)
{
if (isrunningundermono == true)
{
SqliteConnection sqlcon = new SqliteConnection(ConfigurationManager.AppSettings["connectionString"]);
SqliteCommand sqlcmd;
sqlcon.Open();
sqlcmd = sqlcon.CreateCommand();
sqlcmd.CommandText = query;
int total = Convert.ToInt32(sqlcmd.ExecuteScalar());
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
return total;
}
else
{
SQLiteConnection sqlcon = new SQLiteConnection(ConfigurationManager.AppSettings["connectionString"]);
SQLiteCommand sqlcmd;
sqlcon.Open();
sqlcmd = sqlcon.CreateCommand();
sqlcmd.CommandText = query;
int total = Convert.ToInt32(sqlcmd.ExecuteScalar());
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
return total;
}
}
private static DataTable ExecuteDataSet(string query)
{
if (isrunningundermono == true)
{
DataTable dt = new DataTable();
SqliteConnection sqlcon = new SqliteConnection(ConfigurationManager.AppSettings["connectionString"]);
SqliteCommand sqlcmd = new SqliteCommand(sqlcon);
sqlcon.Open();
sqlcmd.CommandText = query;
SqliteDataReader reader = sqlcmd.ExecuteReader();
dt.Load(reader);
reader.Close();
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
return dt;
}
else
{
DataTable dt = new DataTable();
SQLiteConnection sqlcon = new SQLiteConnection(ConfigurationManager.AppSettings["connectionString"]);
SQLiteCommand sqlcmd = new SQLiteCommand(sqlcon);
sqlcon.Open();
sqlcmd.CommandText = query;
SQLiteDataReader reader = sqlcmd.ExecuteReader();
dt.Load(reader);
reader.Close();
sqlcon.Close();
sqlcmd.Dispose();
sqlcon.Dispose();
return dt;
}
}
public static bool IsRunningOnMono()
{
return Type.GetType("Mono.Runtime") != null;
}
SQLiteConnection.Dispose
內部僅調用SQLiteConnection.Close
,因此您仍在有效關閉命令之前的連接,我想這是Mono的問題。 我認為,如果只刪除對sqlcon.Close的顯式調用,則會看到更好的結果。
順便說一句,在處理IDisposable實例時習慣使用using語句 ,例如:
using (var conn = new SQLiteConnection(...))
{
conn.Open();
using (var cmd = new SQLiteCommand(conn))
{
}
}
我認為在連接之前處理該命令是很自然的,因為該命令使用了連接(而using語句有助於使連接保持正確),但是我看不出在Windows上執行相反操作而不在Mono上執行相反操作的理由...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.