猿问

公共静态对象正在被释放

我有以下类,我用它来存储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()调用时我都可以从数据库中重新分配类变量,但是我对数据做了很多后处理,这看起来非常昂贵,我想避免它。


慕桂英4014372
浏览 130回答 1
1回答

POPMUISE

最终,数据读取器(IDataReader或DbDateReader)只能使用一次 - 它是 ADO.NET 提供程序上的原始 API。因此,这让非常毫无意义的存储读者在外地(尤其是静态字段),因为你以后不能检查它(因为它绑定到一个连接,它是可能的连接将被关闭当你尝试)。最好的办法是将数据读入一个列表,并在一个字段中存储一个List<Foo>(对于某些Foo)。像“dapper”这样的工具可以让这一切变得简单,所以你不需要编写任何代码来处理阅读器,例如:int id = ...someField = connection.Query<Order>(&nbsp; &nbsp; "select top 5 * from Orders where CustomerId = @id",&nbsp; &nbsp; new { id }).AsList();
随时随地看视频慕课网APP
我要回答