正在处理公共静态对象

时间:2018-08-03 22:25:43

标签: c# winforms sqlite

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

1 个答案:

答案 0 :(得分:1)

最终,数据读取器(IDataReaderDbDateReader)只能使用一次-它是ADO.NET提供程序上的原始API。这样,将阅读器存储在一个字段(特别是一个静态字段)中就显得非常毫无意义,因为您以后无法对其进行检查(并且由于它是捆绑在一起的)到连接时,尝试时该连接可能已关闭)。

您最好的选择是将数据读入列表,然后在字段中存储List<Foo>(对于某些Foo)。像“ dapper”之类的工具可以使它变得简单,因此您不需要编写任何代码来处理阅读器,例如:

int id = ...
someField = connection.Query<Order>(
    "select top 5 * from Orders where CustomerId = @id",
    new { id }).AsList();