我有一个简单的问题.
我想装饰sqlDataReader类,以便在调用dispose或close方法时,我可以同时处理隐藏的资源.
sqlDataReader类不可继承.
我怎么能做到这一点?我真的不想实现DbDataReader,IDataReader,Idisposable& IDataRecord接口
解决方法
即使您可以从sqlDataReader继承也无关紧要,因为您无法使sqlCommand创建派生类的实例.
当您只是推迟到底层的sqlDataReader时,在包装器中实现IDataReader实际上并不难.它只是耗费一点时间而不是那么糟糕.
但我很好奇,你想要的资源是否已经解决了连接问题?如果是这样,CommandBehavior枚举的CloseConnection成员将确保在关闭数据读取器时关闭连接.
var reader = command.ExecuteReader(CommandBehavior.CloseConnection); ... reader.Close(); // also closes connection
请注意,sqlDataReader上的Close / dispose是相同的.
最后,这是最后一个在过去对我很好的建议.请注意,在下面的松散示例中,即使您在每个记录处“回放”给调用者,您也可以从头到尾拥有sqlDataReader.
private static IEnumerable<IDataRecord> GetResults(this sqlCommand command) { using (var myTicket = new MyTicket()) using (var reader = command.ExecuteReader()) { while (reader.Read()) { yield return reader; } } // the two resources in the using blocks above will be // disposed when the foreach loop below exits } ... foreach (var record in myCommand.GetResults()) { Console.WriteLine(record.GetString(0)); } // when the foreach loop above completes,the compiler-generated // iterator is disposed,allowing the using blocks inside the // above method to clean up the reader/myTicket objects
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。