asp.net读取器关闭时对FieldCount的无效尝试错误

时间:2012-12-05 16:49:53

标签: c# asp.net sqldatareader

  

可能重复:
  Invalid attempt to call FieldCount when reader is closed

我正在使用带有c#的asp.net。 我试图在aspx2.cs上的finally语句中关闭连接。

在aspx1.cs中:

private void BindDataGrids()
{
     try
     {
          DataGrid1.DataSource = instance.ShowDifferences(Convert.ToInt32(Request.QueryString

["CrewId"]), DateTime.Parse(Request.QueryString["StartDate"]), DateTime.Parse(Request.QueryString["EndDate"]));
          DataGrid1.DataBind();
      }
 }

在aspx2.cs中:

 public static SqlDataReader ShowDifferences(int crewID, DateTime date1, DateTime date2)
 {
      Database db = DatabaseFactory.CreateDatabase();
      string sqlCommand = "stored_procedure";
      DBCommandWrapper command = db.GetStoredProcCommandWrapper(sqlCommand);
      try
      {
........code...........
         command.AddInParameter("@EndDate", DbType.Date, date2);
                IDataReader reader = db.ExecuteReader(command);
         return (SqlDataReader)reader;
      }
      finally
      {
          command.Command.Connection.Close();
      }

当它到达DataGrid1.DataBind()时;在aspx1.cs。

我收到错误:

"Invalid attempt to FieldCount when reader is closed error"

如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您要返回一个需要打开连接的阅读器才能Read,但在ShowDifferences退出之前关闭连接。读者是光标,以递增方式获取数据,并且必须连接到数据库以进行整个读取过程。如果要将内存数据集(DataTable)与后端数据库断开连接,请考虑使用Fill的{​​{1}}方法。

<强>更新

“在SqlDataAdapter”移动线后关闭连接

DataGrid1.DataBind();

单独使用command.Command.Connection.Close(); 类的方法(例如instance)并致电

CloseConnection
instance.CloseConnection(); 之后

。当然,为此,您需要将DataGrid1.DataBind();更改为DBCommandWrapper command的班级成员。

答案 1 :(得分:2)

使用DbDataReader时必须打开连接,ExecuteReader不会自动打开它。像这样:

using (DbConnection conn = factory.CreateConnection())
{
   conn.ConnectionString = connString;

   DbCommand cmd = conn.CreateCommand();
   cmd.CommandText = "...";

   conn.Open();
   DbDataReader reader = cmd.ExecuteReader();

   while (reader.Read())
   { ...
   }
}

只有当您使用DataSet时,您才不必处理连接。如果您真的在ExecuteReader方法中打开连接,只要保留读者,就必须保持打开状态。