【问题标题】:How to dispose Command [closed]如何处理命令[关闭]
【发布时间】:2014-09-14 11:52:20
【问题描述】:

我正在从数据库中读取数据(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命令?

添加说明

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

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

【问题讨论】:

  • 在没有创建它的代码中处理一个对象几乎总是错误的,它会导致太多的事故。这需要在调用此方法的任何代码中完成。一个简单的 using 语句很有可能完成工作。

标签: c# ado.net


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2012-08-11
    • 2020-09-29
    • 2017-11-10
    • 1970-01-01
    • 2013-01-15
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多