如何配置命令

时间:2014-09-14 11:52:21

标签: c# ado.net

我正在从数据库(sqlite,Visual Studio 2008,.net 3.5)

中读取数据

我有一个场景,在datadependant层中创建一个datareader,然后返回到一个与数据库无关的层。

    internal static SQLiteDataReader GetReader( SQLiteCommand command)
    {
        SQLiteDataReader reader = command.ExecuteReader();
        command.Dispose();  // Dispose comamnd here? Or is it Ok, not to dispose
                            // command?
        return reader;
    }

或者我必须以某种方式将命令返回到过程,该过程消耗读取器并将其丢弃。或者可以,不处理命令?

已添加说明

问题是,如果可以在创建阅读器之后但在从阅读器读取数据之前处置命令。或者,如果让垃圾收集器处理命令是非常有害的,而是在代码中调用dispose?我还添加了我的建议,在哪里关闭命令。

我尝试再次重新提问,或者提供额外的解释: 如代码片段所示,该命令在迭代和关闭阅读器之前被释放。这将是一个很好的解决方案,因为在代码中,迭代读取器,无法访问命令。在创建阅读器之后,读者仍然需要命令,或者我可以在创建rader之后立即处理它。

1 个答案:

答案 0 :(得分:1)

如果您像这样传回读者,则转移责任将其处理为调用代码。您可以将该代码包装在using块中:

using (SQLiteCommand command = new SQLiteCommand( ... )) {
  using (SQLiteDataReader reader = GetReader(command)) {
    // use the reader
  }
}

请注意,将命令对象传递给GetReader的调用代码仍然负责它。

考虑一下,如果你不能在方法之间传递一次性对象,那么就可以重写代码,这将使责任更容易理解。

例如,您可以传入处理从数据读取器中读取项目的委托,并从函数中返回项目列表:

internal static List<T> GetReader<T>(SQLiteCommand command, Func<SQLiteDataReader, T> readItem) {
  List<T> list = new List<T>();
  using (SQLiteDataReader reader = command.ExecuteReader()) {
    while (reader.Read()) {
      list.Add(readItem(reader));
    }
  }
  return list;
}