【问题标题】:Data reader get closed while passing to a method数据读取器在传递给方法时关闭
【发布时间】:2017-10-27 05:10:50
【问题描述】:

我正在尝试将数据读取器传递给一个方法,但出现如下错误:

阅读器关闭时调用 fieldcount 的尝试无效。

代码

public class ImportService
{
    public IDataReader Reader { get; set; }
    public void MyMethod() 
    {
       string[] Tables = { "Table1", "Table2"};
       foreach (var table in Tables)
       {
          try
           {
                var msSql = new MsSql(table,conn);
                Reader = msSql.Reader;
                msSql.Reader.Close();
                DumpData(conn, Reader);
                Reader.Close();
           }
           catch (Exception ex)
           {
                 //catch exception here
                 Reader.Close();//in case of error while dumping data close the reader.
           }
       }

       conn.close();
   }

   private void DumpData(SqlConnection conn, IDataReader reader) //Invalid attempt to call FieldCount when reader is closed
   {
   }
}

public class MsSql
{
     public IDataReader Reader { get; set; }
     public MsSql(string table, SqlConnection Conn)
     {
             GetData(table,Conn);
     }
     private void GetData(string table, SqlConnection Conn)
     {
        string query = "SELECT * FROM " + table;
        using (SqlCommand cmd = new SqlCommand(query, Conn))
        {
            cmd.CommandTimeout = 0;
            Reader = cmd.ExecuteReader();
        }
     }
}

我在全局对象 Reader 中成功获取数据,但是当我将它传递给我的 dumpdata 方法时出现错误。

我已经检查了以下问题,但他们无法帮助我解决当前的情况:

更新:当我将msSql.Reader 传递给 Dumpdata 时,一切正常,如下所示:

DumpData(conn, msSql.Reader);

【问题讨论】:

  • 嗯,您正在关闭GetData 中的SqlCommand...您希望如何能够从关闭的命令中读取数据?
  • @JonSkeet:但是我在我的 msSql.Reader 中成功获取了记录,当我将 msSql.Reader 传递给 DumpData 方法时它正在工作

标签: c# ado.net sqldatareader


【解决方案1】:

你正在做的是这样的:

  1. 正在检索阅读器Reader = msSql.Reader;
  2. 关闭同一个ReadermsSql.Reader.Close();
  3. 正在尝试从现已关闭的阅读器读取数据:DumpData(conn, Reader)

所以你正试图从一个封闭的读者那里阅读(这大概是 DumpData() 所做的 - 并获得相应的消息。

我认为您误以为通过将同一个对象分配给另一个变量,您正在创建另一个对象。事实并非如此。您只是从不止一个点引用它。

所以:msSql.Reader 和本地 Reader 都引用同一个对象。

【讨论】:

  • 好的,我现在明白了,你是对的,但这样做的原因是如果我在 dumpmethod 中得到任何东西,那么我将如何关闭 mssql 类的读者?
  • 您应该在您的阅读器代码周围使用using 语句 - 这将导致阅读器被处置,因此无论异常等情况如何都会关闭。
  • 好的。非常感谢您的帮助,请继续这样的帮助:)
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 2013-01-25
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2019-05-30
相关资源
最近更新 更多