gpt4 book ai didi

c# - SQLiteConnection 是否在事务内部处理?

转载 作者:行者123 更新时间:2023-12-02 18:38:13 29 4
gpt4 key购买 nike

这有效,但 Resharper 在注释行上说“访问已处理的闭包

using (var db = new SQLiteConnection(SQLitePath))
{
db.CreateTable<Locations>();

db.RunInTransaction(() =>
{
db.Insert(new Locations // Resharper: "Access to disposed closure" ???
{
PersonId = personId,
Latitude = latitude,
Longitude = longitude,
SentTimeUTC = sentTimeUTC,
ReceivedTimeLocal = receivedTimeLocal,
CivicAddress = civicAddress
});
});
}

这种替代方法也有效,但与 Resharper 相同:

    var db = new SQLiteConnection(SQLitePath);
{
db.CreateTable<Locations>();

db.RunInTransaction(() =>
{
    db.Insert(new Locations // this works, although Resharper warns: "Access to disposed closure" ???
{
    PersonId = personId,
Latitude = latitude,
Longitude = longitude,
SentTimeUTC = sentTimeUTC,
ReceivedTimeLocal = ReceivedTimeLocal,
CivicAddress = civicAddress
 });
});
}
db.Dispose();

它们都有效,所以我想这并不重要,但是一种方法比另一种方法更好吗?有没有办法安抚 Resharper 并仍然完成工作?

更新

Donal 所说的似乎很合理,但我仍然在 xaction 中的 Insert 语句中收到此重构代码的 Resharper“潜在代码质量问题”警告:

public void InsertLocationRecord(string personId, double latitude, double longitude,
DateTime sentTimeUTC, DateTime receivedTimeLocal, string civicAddress)
{
Locations locs = new Locations { PersonId = personId,
Latitude = latitude,
Longitude = longitude,
SentTimeUTC = sentTimeUTC,
ReceivedTimeLocal = receivedTimeLocal,
CivicAddress = civicAddress
};

using (var db = new SQLiteConnection(SQLitePath))
{
db.CreateTable<Locations>();

db.RunInTransaction(() =>
{
db.Insert(locs); // Still get, "Access to disposed closure" on this line.
});
}
}

也许我以错误的方式重构了问题?我想这与之前的方式并没有太大的不同;如何确保 locs 实例已被处置?或者这不是问题所在?

最佳答案

问题是您正在中间创建一个 Locations 的自定义子类,它会拾取当前上下文中不需要的各种内容,而 ReSharper 是接受这一点(并且无法证明它不会以某种方式逃脱)。最简单的修复方法实际上是向 Locations 添加一个构造函数(或多个构造函数,如果需要),以允许您使用所有正确的值实例化它,而无需闭包捕获。

关于c# - SQLiteConnection 是否在事务内部处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026948/

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