System.ObjectDisposedException - 在 Using 块中使用 SQL 连接
System.ObjectDisposedException - Using SQL Connection within Using Block
System.ObjectDisposedException HResult=0x80131622 Message=Cannot
access a disposed object. Object name: 'SQLiteConnection'.
Source=System.Data.SQLite
我编写了一个使用 Dapper 和 DapperExtensions 的简单存储库
尝试检索某些结果时,在视图模型的方法 returns 之后使用 Using
块时出现此错误。使用连接的 Open/Close 方法替换 Using 块时,我没有收到错误。感觉问题很简单,就是看不出来
我的 "base" 数据库存储库
using System.Data.SQLite;
namespace WpfApp1.Data
{
public class SqliteBaseRepository
{
public static string DbFile
{
get { return @"D:\PROJECTS\test.db"; }
//get { return Environment.CurrentDirectory + "\SimpleDb.sqlite"; }
}
public SQLiteConnection DbConnection()//dbconnection
{
return new SQLiteConnection("Data Source=" + DbFile);
}
}
}
通用存储库:
public class Repository<TPoco, TDatabase>
where TPoco : class
where TDatabase : SqliteBaseRepository, new()
{
private TDatabase DB = new TDatabase();
public IEnumerable<TPoco> FindAll(object predicate=null)
{
IEnumerable<TPoco> result;
using (var cnn = DB.DbConnection())
{
//var cnn = DB.DbConnection();
cnn.Open();
result = cnn.GetList<TPoco>(predicate);
}
return result;
}
}
在我的视图模型的构造函数中,我在这里遇到错误:
public PartViewModel()
{
var x = _PartRepository.FindAll(); //no error. There are results/data in here
var y = new ObservableCollection<Part>(x); //error raised here
}
使用 Open/Close 而不是 Using
块不会产生错误:
public IEnumerable<TPoco> FindAll(object predicate=null)
{
IEnumerable<TPoco> result;
var cnn = DB.DbConnection();
cnn.Open();
var result = cnn.GetList<TPoco>(predicate);
cnn.Close();
return result;
}
您需要在 using
块内迭代结果:
using (var cnn = DB.DbConnection())
{
//var cnn = DB.DbConnection();
cnn.Open();
result = cnn.GetList<TPoco>(predicate);
result = result.ToList(); // fetch records now
}
return result;
一个Linq查询是'lazy',实际的Db I/O被推迟了。在您的原始情况下,直到 after 您关闭了连接。
System.ObjectDisposedException HResult=0x80131622 Message=Cannot access a disposed object. Object name: 'SQLiteConnection'.
Source=System.Data.SQLite
我编写了一个使用 Dapper 和 DapperExtensions 的简单存储库
尝试检索某些结果时,在视图模型的方法 returns 之后使用 Using
块时出现此错误。使用连接的 Open/Close 方法替换 Using 块时,我没有收到错误。感觉问题很简单,就是看不出来
我的 "base" 数据库存储库
using System.Data.SQLite;
namespace WpfApp1.Data
{
public class SqliteBaseRepository
{
public static string DbFile
{
get { return @"D:\PROJECTS\test.db"; }
//get { return Environment.CurrentDirectory + "\SimpleDb.sqlite"; }
}
public SQLiteConnection DbConnection()//dbconnection
{
return new SQLiteConnection("Data Source=" + DbFile);
}
}
}
通用存储库:
public class Repository<TPoco, TDatabase>
where TPoco : class
where TDatabase : SqliteBaseRepository, new()
{
private TDatabase DB = new TDatabase();
public IEnumerable<TPoco> FindAll(object predicate=null)
{
IEnumerable<TPoco> result;
using (var cnn = DB.DbConnection())
{
//var cnn = DB.DbConnection();
cnn.Open();
result = cnn.GetList<TPoco>(predicate);
}
return result;
}
}
在我的视图模型的构造函数中,我在这里遇到错误:
public PartViewModel()
{
var x = _PartRepository.FindAll(); //no error. There are results/data in here
var y = new ObservableCollection<Part>(x); //error raised here
}
使用 Open/Close 而不是 Using
块不会产生错误:
public IEnumerable<TPoco> FindAll(object predicate=null)
{
IEnumerable<TPoco> result;
var cnn = DB.DbConnection();
cnn.Open();
var result = cnn.GetList<TPoco>(predicate);
cnn.Close();
return result;
}
您需要在 using
块内迭代结果:
using (var cnn = DB.DbConnection())
{
//var cnn = DB.DbConnection();
cnn.Open();
result = cnn.GetList<TPoco>(predicate);
result = result.ToList(); // fetch records now
}
return result;
一个Linq查询是'lazy',实际的Db I/O被推迟了。在您的原始情况下,直到 after 您关闭了连接。