gpt4 book ai didi

c# - System.ObjectDisposedException - 在 Using block 中使用 SQL 连接

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:40 31 4
gpt4 key购买 nike

System.ObjectDisposedException HResult=0x80131622 Message=Cannot access a disposed object. Object name: 'SQLiteConnection'.
Source=System.Data.SQLite

我编写了一个使用 Dapper 和 DapperExtensions 的简单存储库

当尝试检索某些结果时,在方法返回到 View 模型后使用 Using block 时出现此错误。当用连接的打开/关闭方法替换 Using block 时,我没有收到错误。感觉问题很简单,就是看不出来。

我的“基础”数据库存储库

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;
}
}

在我的 View-Model 的构造函数中,我在这里遇到错误:

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 block 不会产生错误:

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 block 中迭代结果:

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 查询是“惰性”的,实际的 Db I/O 被推迟。在您的原始情况下,直到您关闭连接之后

关于c# - System.ObjectDisposedException - 在 Using block 中使用 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56632829/

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