当我从sqldatareader读取数据时,出现错误“关闭读取器时,无效尝试调用Read”。我的代码如下
显然,这已被ExecSqlDataReader中的using语句关闭
我希望能够调用此方法,然后在另一个类中使用阅读器,是否有办法绕过这个问题而不必在ExecSqlDataReader方法中遍历SqlDataReader?
希望有道理
谢谢
码:
SqlDataReader reader = data.ExecSqlDataReader(1);
while (reader.Read())
{
.....
}
public SqlDataReader ExecSqlDataReader(int queryType = 0)
{
using (var conn = new SqlConnection(this.ConnectionString))
{
try
{
PrepareCommandForExecution(conn, queryType);
return _cmd.ExecuteReader();
}
finally
{
_cmd.Connection.Close();
}
}
}
private SqlCommand PrepareCommandForExecution(SqlConnection conn, int sqlType = 0)
{
_cmd.Connection = conn;
switch (sqlType)
{
case 0:
_cmd.CommandType = CommandType.StoredProcedure;
break;
case 1:
_cmd.CommandType = CommandType.Text;
_cmd.CommandText = _tSqltext;
break;
case 2:
_cmd.CommandType = CommandType.TableDirect;
break;
}
_cmd.CommandTimeout = this.CommandTimeout;
_cmd.Connection.Open();
return _cmd;
}
Run Code Online (Sandbox Code Playgroud)
问题在于,离开函数(通过return语句)会将您踢出这些using块,因此您正在使用的SqlDataReader和SqlConnections被处置。要解决此问题,请尝试按以下方式更改函数签名:
public static IEnumerable<IDataRecord> ExecSqlDataReader( int queryType )
Run Code Online (Sandbox Code Playgroud)
然后像这样更新函数的中间部分:
using ( var reader = cmd.ExecuteReader() )
{
while ( reader.Read() )
{
yield return reader;
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用它:
var first10 = ExecSqlDataReader(0).Take(10);
foreach (var rec in first10)
{
int ID = rec.GetInt32(0);
}
Run Code Online (Sandbox Code Playgroud)
因此这应该起作用,因为yield会使Connection保持活动状态:
| 归档时间: |
|
| 查看次数: |
7161 次 |
| 最近记录: |