2012-07-05 131 views
0

我有一個快速的問題,我的連接沒有被初始化。連接未初始化

當我調用create方法時,我傳入了一堆varnames,比如說「ABC,XYZ等」。

在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

感謝喬恩·斯凱特返回 – cdub 2012-07-05 22:53:54

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,我會改變的try /捕獲你的代碼的一部分。
如果你真的需要從這個代碼用布爾然後

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;  
}