2017-04-22 21 views
0

ループ内で複数のクエリを実行しようとしています。最初のクエリは、コードをステップ実行したときに表示されるので、正常に実行されます。複数のクエリがループ内で実行されない

ただし、ループ内にある2番目のクエリは、最初のクエリから保​​持されている値に応じて実行されます。その値に基づいてループが実行されると、クエリを無視しているようです。私は、クエリの代わりに表示するラベルを貼り、それが表示されますので、私は私の接続を開いたり閉じたりしていると信じています。

C#コード:

protected void Page_Load(object sender, EventArgs e) 
    { 

     // Get the session of the user 
     string staffid = Session["StaffId"].ToString(); 

     //Proxy on page load to check IsActive Status 
     string DefaultConnection = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

     SqlConnection myConnection = new SqlConnection(DefaultConnection); 
     myConnection.Open(); 

     //select the userdetail specific to the logged in user using parameterisation 
     string query = "SELECT ProxyStatus.ProxyStatusId, ProxyStatus.FunctionId, ProxyStatus.StartDate, ProxyStatus.EndDate, ProxyStatus.IsActive FROM ProxyStatus INNER JOIN Staff ON Staff.StaffId = ProxyStatus.Proxee WHERE (Staff.StaffId = @StaffId)"; 

     DateTime thisDay = DateTime.Today; 

     SqlCommand myCommand = new SqlCommand(query, myConnection); 

     myCommand.Parameters.AddWithValue("@staffid", staffid); 
     SqlDataReader rdr = myCommand.ExecuteReader(); 

     if (rdr.HasRows) 
     { 

      while (rdr.Read()) 
      { 
       Session["StartDate"] = rdr["StartDate"].ToString(); 
       Session["EndDate"] = rdr["EndDate"].ToString(); 
       Session["ProxyStatusId"] = rdr["ProxyStatusId"].ToString(); 
       Session["FunctionId"] = rdr["FunctionId"].ToString(); 

       // Get the session of StartDate and endate, use the session value in a query to compare against the current date 
       string startdate = Session["StartDate"].ToString(); 
       string enddate = Session["EndDate"].ToString(); 
       string proxystatus = Session["ProxyStatusId"].ToString(); 

       DateTime startdatedata = Convert.ToDateTime(startdate); 
       DateTime enddatedata = Convert.ToDateTime(enddate); 

       if (startdatedata > thisDay) 
       { 
        string DefaultConnection2 = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

        SqlConnection myConnection2 = new SqlConnection(DefaultConnection2); 
        myConnection2.Open(); 

        string query2 = "UPDATE ProxyStatus SET ProxyStatus.IsActive = 'False' WHERE ProxyStatus.ProxyStatusId = @proxystatus"; 


        myCommand.Parameters.AddWithValue("@newproxystatus", proxystatusnew); 

        SqlCommand myCommand2 = new SqlCommand(query2, myConnection2); 

         myCommand2.ExecuteNonQuery(); 

       } 
      } 
     } 
     else 
     { 
      rdr.Close(); 
     } 
    } 
} 

}

+0

コードで2番目のクエリをどこで実行しているのかわかりません。コマンドオブジェクトは構築されますが、ExecuteReader()はありません。 –

+0

ExecuteReaderを追加すると、次のエラーが表示されます。 "このコマンドに関連付けられている開いているDataReaderが既にあり、最初に閉じる必要があります。 上記の変更を参照してください –

答えて

2

は線が

SqlCommand myCommand2 = new SqlCommand(query2, myConnection2); 
myCommand.ExecuteNonQuery(); 

すべきではない代わりに

SqlCommand myCommand2 = new SqlCommand(query2, myConnection2); 
myCommand2.ExecuteNonQuery(); 

こと?最初の "myCommand"は引き続き "rdr"と共に使用されます。

+0

クエリが実行されていますが、エラーは表示されません。 スカラー変数 "@newproxystatus"を宣言する必要があります。 これはどんな考えですか?ブレークポイントを使用して実行すると、ProxyStatusIdが7(これは私が望むもの)であるが、クラッシュする。 –

+0

あなたの質問2文字列に。あなたは "@proxystatus"を持っています。しかし、次の行では "@ newproxystatus"を参照しています。同じ名前を付ける必要があります。 – gmalenko

関連する問題