2012-07-05 6 views
0

연결이 초기 상태가 아니므로 빠른 문제가 있습니다.연결이 초기화되지 않았습니다.

나는 create 메소드를 호출 할 때 "ABC, XYZ, etc"와 같은 많은 varnames를 전달합니다.

foreach의 첫 번째 단계에서 저장 프로 시저가 올바르게 호출되고 모든 것이 제대로 작동합니다. 그러나 두 번째 패스에서, 나는 "ConnectionString을 속성이 intialized되지 않은 얻을

내가 루프의 외부 myConn.open 및 myConn.close을 이주자해야

내 코드 :.?

public bool Create() 
{ 
     bool isSuccess = true; 

     ConnectionStringSettings myConnectionStringSetting = ConfigurationManager.ConnectionStrings[0]; 
     DbProviderFactory dbFactory = DbProviderFactories.GetFactory(myConnectionStringSetting.ProviderName); 

     DbConnection myConn = dbFactory.CreateConnection(); 
     myConn.ConnectionString = myConnectionStringSetting.ConnectionString; 

     DataTable myDataTable = new DataTable(); 

     string[] varNamesArray = m_variableNames.Split(','); 

     foreach (string varName in varNamesArray) 
     { 
      string vn = varName.Trim(); 

      //stored procedure 

      DbCommand myCommand = dbFactory.CreateCommand(); 
      myCommand.CommandText = "s_LockVariables"; 
      myCommand.CommandType = CommandType.StoredProcedure; 
      myCommand.Connection = myConn; 

      //variables    

      DbParameter param1 = myCommand.CreateParameter(); 
      param1.ParameterName = "@varName"; 
      param1.DbType = DbType.String; 
      param1.Value = vn; 
      myCommand.Parameters.Add(param1); 

      DbParameter param2 = myCommand.CreateParameter(); 
      param2.ParameterName = "@datasetID"; 
      param2.DbType = DbType.Int32; 
      param2.Value = m_datasetID; 
      myCommand.Parameters.Add(param2); 

      DbParameter param3 = myCommand.CreateParameter(); 
      param3.ParameterName = "@userID"; 
      param3.DbType = DbType.Int32; 
      param3.Value = m_userID; 
      myCommand.Parameters.Add(param3); 

      DbParameter param4 = myCommand.CreateParameter(); 
      param4.ParameterName = "@currentTime"; 
      param4.DbType = DbType.DateTime; 
      param4.Value = DateTime.Now; 
      myCommand.Parameters.Add(param4); 

      try 
      { 
       using (myConn) 
       { 
        myConn.Open(); 
        myCommand.ExecuteNonQuery(); 
        myConn.Close(); 
       } 
      } 
      catch (Exception e) 
      { 
       isSuccess = false; 
       throw new Exception(e.Message); 
       //TODO: catch data error 

       return isSuccess; 
      } 
     } 

     return isSuccess; 
    } 

답변

6

당신은 여기 foreach 루프 내 myConn 폐기하고 있습니다 :

using (myConn) 
{ 
    myConn.Open(); 
    myCommand.ExecuteNonQuery(); 
    myConn.Close(); 
} 

나는 그냥 변수를 잘 t를 선언하는 변경 제안 여기 :

using (DbConnection myConn = dbFactory.CreateConnection()) 
{ 
    myConn.ConnectionString = myConnectionStringSetting.ConnectionString; 
    myConn.Open(); 
    myCommand.Connection = myConn; 
    myCommand.ExecuteNonQuery(); 
    // Closed automatically due to being disposed 
} 

하거나 루프를 외부 단일 using이 - 당신은뿐만 아니라 바로, 모든 명령에 대해 동일한 연결을 사용할 수 있는가?

+0

감사 존의 SKET이 코드에서 반환해야하는 경우 – cdub

2

이 코드

using (myConn) 
{ 
    myConn.Open(); 
    myCommand.ExecuteNonQuery(); 
    myConn.Close(); 
} 

내가

using(DbConnection myConn = dbFactory.CreateConnection()) 
    { 
     myConn.ConnectionString = myConnectionStringSetting.ConnectionString; 
     DataTable myDataTable = new DataTable(); 
     string[] varNamesArray = m_variableNames.Split(','); 
     foreach (string varName in varNamesArray) 
     { 
      ... 
      // the rest of your code 
      ... 
      // Then do not add the using statement here 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
      myConn.Close(); 
      .... 
     } 
    } 

이 방법으로 그것을 변경하려고합니다
첫 번째 루프의 끝에서 myConn의 VAR을 파괴, 나는 시도를 변경합니다/코드의 일부를 잡아라.
당신이 정말로 부울 다음

catch (Exception e)  
{  
    isSuccess = false;  
    // If you rethrow a new Exception here you will never reach the return statement 
    // In this cases (assuming we are inside a library) I will try to save the exception 
    // in a global var (GetLastError comes to mind) or log everything in a file 
    return isSuccess;  
}  
관련 문제