甲骨文数据阅读器。错误:无效操作。连接已关闭
Posted
技术标签:
【中文标题】甲骨文数据阅读器。错误:无效操作。连接已关闭【英文标题】:OracleDataReader. Error: Invalid operation. The connection is closed 【发布时间】:2014-03-31 03:24:27 【问题描述】:从 Oracle DB 获取内容时遇到错误。
这是我的代码:
public virtual IDataReader LoadDataReaderWithSqlString(string strQuery, ISessionScope session)
var s = GetSession(session);
using (var connection = s.Connection)
var command = connection.CreateCommand();
command.Connection = connection;
if (connection.State == ConnectionState.Closed || connection.State == ConnectionState.Broken)
connection.Open();
command.CommandType = CommandType.Text;
command.CommandText = s.CreateSQLQuery(strQuery).ToString();
s.Transaction.Enlist(command); // Set the command to exeute using the NHibernate's transaction
using (var dataReader = command.ExecuteReader())
if(dataReader.Read())
return dataReader;
return null;
当我调试时,我能够在 dataReader 中看到返回值。 我使用 NHibernate 运行原始 SQL。我想返回 DataReader。谁能帮帮我?
【问题讨论】:
【参考方案1】:您是否要返回打开的IDataReader
?问题是您将ExecuteReader
包装在using 语句中。 using
表示您的dataReader
将在using
内部的代码执行后被释放。所以你返回处置的对象。解决办法是:去掉using
:
var dataReader = command.ExecuteReader();
if(dataReader.Read())
return dataReader;
连接对象也是如此。
添加
正如大卫在 cmets 中提到的,您可能希望避免资源泄漏(我的意思是打开连接但未执行命令的情况),那么您应该像这样处理异常:
public virtual IDataReader LoadDataReaderWithSqlString(string strQuery, ISessionScope session)
try
var s = GetSession(session);
var connection = s.Connection;
var command = connection.CreateCommand();
command.Connection = connection;
if (connection.State == ConnectionState.Closed || connection.State == ConnectionState.Broken)
connection.Open();
command.CommandType = CommandType.Text;
command.CommandText = s.CreateSQLQuery(strQuery).ToString();
s.Transaction.Enlist(command); // Set the command to exeute using the NHibernate's transaction
try
var dataReader = command.ExecuteReader();
if(dataReader.Read())
return dataReader;
catch (DbException)
// error executing command
connection.Close();
return null; // or throw; // it depends on your logic
catch (DbException)
// if connection was not opened
return null; // or throw; // it depends on your logic
return null;
【讨论】:
也许将所有内容都包装在一个 try catch 中? @DavidMerinos 是的,这可能是一个选择。谢谢! 这里的第二行可能是多余的: var command = connection.CreateCommand(); command.Connection = 连接; 嗯。我仍然得到错误。无效操作。 OracleDataReader 已关闭。 @kingjia 好的,我需要更多细节:你为什么不创建一个新的DbConnection
而不是使用一些现有的?这可能会给您带来问题。【参考方案2】:
那是因为你有
using (var connection = s.Connection)
和 using (var dataReader = command.ExecuteReader())
using
块将处理对象(此处为 connection
和 dataReader
)
如果您需要返回dataReader
,请删除 using 块
【讨论】:
以上是关于甲骨文数据阅读器。错误:无效操作。连接已关闭的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 Visual c# 程序更新 oracle 时出现“无效操作。连接已关闭”错误
SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”
Android SSL HttpGet(无对等证书)错误或(对等连接已关闭)错误