我有以下类,我用它来存储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 回答
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
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();
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报
0/150
提交
取消