gpt4 book ai didi

c# - 在Mono下运行sqlite获取``无法打开数据库文件''

转载 作者:行者123 更新时间:2023-12-03 18:19:54 24 4
gpt4 key购买 nike

我第一次发帖。

我制作了一个在后台运行的控制台应用程序,它是用C#编写的,并且我正在使用sqlite3来存储其信息。它在单声道下运行,但是运行几天后我得到了unable to open database file。重新启动应用程序即可解决问题,但几天后它将给我同样的错误。

我怀疑是关闭后连接没有被释放,所以我在connection.close()之后添加了释放,但是仍然收到相同的错误。我也做了一些搜索,发现this thread也有类似的问题,我按照他说的做了,但仍然遇到相同的错误。

任何帮助将不胜感激。

对不起英语不好

更新:
我的密码

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 statement,例如:

using (var conn = new SQLiteConnection(...))
{
conn.Open();
using (var cmd = new SQLiteCommand(conn))
{
}
}


我认为在连接之前先处理该命令是很自然的,因为该命令使用了连接(而using语句有助于使连接保持正确),但是我看不出在Windows上执行相反操作而不在Mono上起作用的理由...

关于c# - 在Mono下运行sqlite获取``无法打开数据库文件'',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com