数据读取器在传递给方法时关闭

时间:2017-01-16 11:34:31

标签: c# ado.net sqldatareader

我正在尝试将数据读取器传递给方法,但收到如下错误:

  

关闭阅读器时尝试调用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);

1 个答案:

答案 0 :(得分:2)

你在做什么是这样的:

  1. 检索阅读器Reader = msSql.Reader;
  2. 关闭自我阅读器msSql.Reader.Close();
  3. 正在尝试从已关闭的阅读器中读取数据:DumpData(conn, Reader)
  4. 所以你试图从封闭的读者那里读取(大概是DumpData()所做的 - 并得到相应的信息。

    我认为你在误解的情况下工作,通过将同一个对象分配给另一个变量来创建另一个对象。事实并非如此。您只是从多个角度引用它。

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