如何处置命令

本文关键字:命令 何处置 | 更新日期: 2023-09-27 18:21:52

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

我有一个场景,在一个依赖数据库的层中创建一个数据读取器,并将其返回到一个独立于数据库的层。

    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之后立即处理它吗。

如何处置命令

如果像那样将读取器传递回,则将处理它的责任转移到调用代码。您可以将该代码封装在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;
}