1

可能重复:
阅读器关闭时调用 FieldCount 的尝试无效

我在 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"

如何解决这个问题?

4

2 回答 2

4

您正在返回一个需要打开连接才能访问的阅读器,但您在退出Read之前关闭了连接。ShowDifferences读取器是增量获取数据的游标,读取的整个过程都必须连接到数据库。如果您想将内存数据集 ( DataTable) 与后端数据库断开连接,请考虑Fill使用SqlDataAdapter.

更新:

DataGrid1.DataBind();“移动线之后关闭连接”

command.Command.Connection.Close();

instance's 类的单独方法(例如CloseConnection)并调用

instance.CloseConnection();

之后DataGrid1.DataBind();。为此,当然,您需要更改DBCommandWrapper commandinstance' 类成员。

于 2012-12-05T17:03:31.217 回答
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())
   { ...
   }
}

只有当您使用 a 时,DataSet您才不必处理连接。如果你真的在你的 ExecuteReader 方法中打开了连接,你必须保持它打开,只要你保持阅读器。

于 2012-12-05T19:20:37.523 回答