-2

既存のデータ リーダーで新しいデータ リーダーを開くことはできませんか?? 助けてください。私はC#が初めてです

string statement11 = "SELECT Planning FROM allow where NPLID=(SELECT MAX(NPLID) FROM allow)";

SqlCommand myCommand11 = new SqlCommand(statement11, con1);
SqlDataReader plan2 = myCommand11.ExecuteReader();
while(plan2.Read())

if (!plan2.IsDBNull(0) && "ok" == plan2.GetString(0))
{
    string statement99 = "SELECT Dropplan FROM NPLQAnew where NPLID=(SELECT MAX(NPLID) FROM allow)";
    SqlDataReader myReader1 = null;
    SqlCommand myCommand114 = new SqlCommand(statement99, con1);
    SqlDataReader plandrop = myCommand114.ExecuteReader();
    while (plandrop.Read())
        if (plandrop.IsDBNull(0) && plandrop.GetString(0) == "Red")
        {

            Lblplan1.BackColor = System.Drawing.Color.Red;
        }
        else if (plandrop.IsDBNull(0) && "amber" == plandrop.GetString(0))
        {

            Lblplan1.BackColor = System.Drawing.Color.Orange;
        }
        else if (plandrop.IsDBNull(0) && "Green" == plandrop.GetString(0))
        {
            Lblplan1.BackColor = System.Drawing.Color.Green;
        }
    plandrop.Close();


    this.Lblplan1.Visible = true;



}

plan2.Close();
4

5 に答える 5

3

既定では、SQL Server クライアントでは、同じ接続で 2 つのクエリを同時に開くことはできません。たとえば、1 つのデータ リーダーの結果を読み取っている場合、同じ接続を使用して 2 番目から読み取りを開始することはできません。また、SQL Server の接続プーリングの動作方法では、"新しい" 接続を要求しても動作することが保証されていません。

これを修正する方法にはいくつかのオプションがあります。1 つ目は、ネストされた SQL 実行呼び出しを排除するためにコードをリファクタリングすることです。たとえば、ループして処理する前に、最初のクエリの結果をメモリに読み込みます。

簡単な答えは、接続で "MARS" (複数のアクティブなレコードセット) を有効にすることです。これは"MARS Connection=True、接続文字列のオプションを設定して機能を有効にすることで行われます。これは一般的に非常に安全に行うことができ、古いアプリケーションの 2005 年より前の動作を維持するためにデフォルトでのみオフになっていますが、リンクされた記事にはいくつかのガイドラインが示されています。

于 2013-10-07T06:31:53.557 に答える
0

USINGステートメントを使用します。using ステートメントは、オブジェクトの Dispose メソッドを正しい方法で呼び出します。また、Dispose が呼び出されるとすぐに、オブジェクト自体がスコープ外になります。

エラーの場合: 現在の接続文字列には既にデータ リーダーが接続されています。最初にデータ リーダーを閉じてみてください。

于 2013-10-07T06:30:08.623 に答える
0

いいえ、同じ接続でこれを実行することはできませんが、 複数のアクティブな結果セット (MARS)によって達成できます。sqlserver 2005 以降が必要です。

また

2 番目のコマンドを実行するには、別の接続を開く必要があります。

于 2013-10-07T06:30:01.053 に答える
0

この行の後

  if (!plan2.IsDBNull(0) && "ok" == plan2.GetString(0))
  {
   //open a new sql connection here
   //your string statement99

    :
    :


  // then close your second sql connection here before the  last  }  

  }
于 2013-10-07T06:50:44.357 に答える