为了账号安全,请及时绑定邮箱和手机立即绑定

公共静态对象正在被释放

公共静态对象正在被释放

C#
慕桂英4014372 2021-11-14 17:08:02
我有以下类,我用它来存储SQLite读取器数据以绘制到paintevent中以在Invalidate()调用时在winform上绘制。该类已创建如下:public class Reader{    static public SQLiteDataReader nodes;    static public SQLiteDataReader conduits;    static public SQLiteDataReader catchments;} 例如,该类的变量分配如下: //click event when a conduit is created SQLiteDataReader reader = SqlConnections.FindNode(x, y); //this grabs data from my database Reader.conduits = reader;我遇到的问题是当Invalidate()被调用时,没有重新分配 Reader 类变量的数据,它的变量被清空,即使它们最近被填充并显示在屏幕上。起初,我以为我遇到了常见的“绘制事件对象消失”,但是当这不应该发生在静态变量上时,我的类变量肯定会继续处理。这有什么共同的原因吗?我知道每次Invalidate()调用时我都可以从数据库中重新分配类变量,但是我对数据做了很多后处理,这看起来非常昂贵,我想避免它。
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

最终,数据读取器(IDataReader或DbDateReader)只能使用一次 - 它是 ADO.NET 提供程序上的原始 API。因此,这让非常毫无意义的存储读者在外地(尤其是静态字段),因为你以后不能检查它(因为它绑定到一个连接,它是可能的连接将被关闭当你尝试)。


最好的办法是将数据读入一个列表,并在一个字段中存储一个List<Foo>(对于某些Foo)。像“dapper”这样的工具可以让这一切变得简单,所以你不需要编写任何代码来处理阅读器,例如:


int id = ...

someField = connection.Query<Order>(

    "select top 5 * from Orders where CustomerId = @id",

    new { id }).AsList();


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信