2013-04-02 4 views
0
 SqlConnection sqlConn = new SqlConnection(MyClass.GlobalConn()); 
     sqlConn.Open(); 

     try 
     { 
      string getAllBranch = "SELECT iBranch_num,LTRIM(RTRIM(sConstant)) FROM tblgobranch"; 
      SqlCommand cmdgetAllBranch = new SqlCommand(getAllBranch, sqlConn); 
      SqlDataReader dRgetAllBranch=cmdgetAllBranch.ExecuteReader(); 



      while (dRgetAllBranch.Read()) 
      { 

       SqlCommand cmd = new SqlCommand("dbo.rvk_GetSalesPerItem", sqlConn); 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = FromDT1; 
       cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = ToDT2; 
       cmd.Parameters.Add("@BRANCH", SqlDbType.NVarChar).Value = dRgetAllBranch[1].ToString(); 
       cmd.Parameters.Add("@brNum", SqlDbType.Int).Value = dRgetAllBranch[0].ToString(); 
       cmd.Parameters.Add("@PluCode", SqlDbType.NVarChar).Value = str1; 
       cmd.ExecuteNonQuery(); 

      } 

я получил здесь ошибкаОшибка при выполнении хранимой процедуры с использованием Хотя условие

«Существует уже открыт для чтения данных, связанный с этой командой»

Пожалуйста, помогите мне с этим ,

+0

пытается использовать новый объект Connection каждый раз, когда вы вызываете rvkGetSalesPerItem SP. – jerjer

+0

Что делает метод MyClass.GlobalConn'? –

+0

моя строка подключения для подключения к моей базе данных. –

ответ

2

В настоящее время вы выполняете чтение с открытым подключением (SqlDataReader dRgetAllBranch=cmdgetAllBranch.ExecuteReader();), пока вы пытаетесь выполнить хранимую процедуру в том же соединении. В этом причина ошибки.

Попробуйте это вместо того, чтобы в вашем while цикле

SqlConnection sqlConnStoredProc = new SqlConnection(MyClass.GlobalConn()); 
sqlConnStoredProc.Open(); 

SqlCommand cmd = new SqlCommand("dbo.rvk_GetSalesPerItem", sqlConnStoredProc); 
cmd.CommandType = CommandType.StoredProcedure; 

cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = FromDT1; 
cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = ToDT2; 
cmd.Parameters.Add("@BRANCH", SqlDbType.NVarChar).Value = dRgetAllBranch[1].ToString(); 
cmd.Parameters.Add("@brNum", SqlDbType.Int).Value = dRgetAllBranch[0].ToString(); 
cmd.Parameters.Add("@PluCode", SqlDbType.NVarChar).Value = str1; 
cmd.ExecuteNonQuery(); 

sqlConnStoredProc.Close(); 
+0

thank @ jordanhill123, его работа. –

1

Вы должны использовать новый объект подключения, чтобы выполнить другую команду, в то время как читатель используется.

SqlConnection sqlConn = new SqlConnection(MyClass.GlobalConn()); 
    sqlConn.Open(); 

    try 
    { 
     string getAllBranch = "SELECT iBranch_num,LTRIM(RTRIM(sConstant)) FROM tblgobranch"; 
     SqlCommand cmdgetAllBranch = new SqlCommand(getAllBranch, sqlConn); 
     SqlDataReader dRgetAllBranch=cmdgetAllBranch.ExecuteReader(); 




     while (dRgetAllBranch.Read()) 
     { 
      using(var con = new SqlConnection(MyClass.GlobalConn())) 
      { 

      con.Open(); 

      SqlCommand cmd = new SqlCommand("dbo.rvk_GetSalesPerItem", con); 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = FromDT1; 
      cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = ToDT2; 
      cmd.Parameters.Add("@BRANCH", SqlDbType.NVarChar).Value = dRgetAllBranch[1].ToString(); 
      cmd.Parameters.Add("@brNum", SqlDbType.Int).Value = dRgetAllBranch[0].ToString(); 
      cmd.Parameters.Add("@PluCode", SqlDbType.NVarChar).Value = str1; 
      cmd.ExecuteNonQuery(); 

      } 

     } 
0

Я думаю, что вам нужно открытое соединение в петле

while (dRgetAllBranch.Read()) 
     { 

      SqlCommand cmd = new SqlCommand("dbo.rvk_GetSalesPerItem", sqlConn); 
      cmd.Connection.Open(); //Open 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = FromDT1; 
      cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = ToDT2; 
      cmd.Parameters.Add("@BRANCH", SqlDbType.NVarChar).Value = dRgetAllBranch[1].ToString(); 
      cmd.Parameters.Add("@brNum", SqlDbType.Int).Value = dRgetAllBranch[0].ToString(); 
      cmd.Parameters.Add("@PluCode", SqlDbType.NVarChar).Value = str1; 
      cmd.ExecuteNonQuery(); 
      cmd.Connection.Close(); //Close 
     } 
0

Вы можете использовать только только один SqlCommand. Открыть перед циклом while и закрыть цикл.

SqlConnection sqlConn = new SqlConnection(MyClass.GlobalConn()); 
    sqlConn.Open(); 

    try 
    { 
     string getAllBranch = "SELECT iBranch_num,LTRIM(RTRIM(sConstant)) FROM tblgobranch"; 
     SqlCommand cmdgetAllBranch = new SqlCommand(getAllBranch, sqlConn); 
     SqlDataReader dRgetAllBranch=cmdgetAllBranch.ExecuteReader(); 


     SqlCommand cmd = new SqlCommand("dbo.rvk_GetSalesPerItem", sqlConn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Connection.Open();//open one time 
     while (dRgetAllBranch.Read()) 
     {     
      cmd.parameters.Cler();//clear old parameter and add new 
      cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = FromDT1; 
      cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = ToDT2; 
      cmd.Parameters.Add("@BRANCH", SqlDbType.NVarChar).Value = dRgetAllBranch[1].ToString(); 
      cmd.Parameters.Add("@brNum", SqlDbType.Int).Value = dRgetAllBranch[0].ToString(); 
      cmd.Parameters.Add("@PluCode", SqlDbType.NVarChar).Value = str1; 
      cmd.ExecuteNonQuery(); 

     } 
     cmd.Connection.Close();//open one time 
Смежные вопросы