1

重複の可能性:
リーダーが閉じているときにFieldCountを呼び出そうとする試みが無効です

asp.netをc#で使用しています。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のクラスの別のメソッド(例CloseConnection)に移動し、

instance.CloseConnection();

DataGrid1.DataBind();。もちろん、このためには、のクラスメンバーに変更DBCommandWrapper commandする必要があります。instance

于 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())
   { ...
   }
}

を使用する場合にのみDataSet、接続を処理する必要はありません。ExecuteReaderメソッドで実際に接続を開く場合は、リーダーを保持している限り、接続を開いたままにしておく必要があります。

于 2012-12-05T19:20:37.523 に答える