我有以下类,用于存储SQLite
读者数据,以在调用Invalidate()
时绘制到paintevent上并在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()
时我都可以从数据库中重新分配类变量,但是我对数据进行了很多后期处理,这看起来非常昂贵,我想避免这种情况。
答案 0 :(得分:1)
最终,数据读取器(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();