簡體   English   中英

在Mono下運行sqlite獲取``無法打開數據庫文件''

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM