我正在从数据库(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之后立即处理它。
答案 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;
}