2014-01-17 73 views
0

我們有一個應用程序在整個運行過程中調用幾次存儲過程數千次。該應用程序使用以下SQLLogger對象作爲日誌記錄機制。也就是說該對象被實例化一次,並且每次執行後調用WriteLogLine方法。我們最近更改了代碼以在多個線程上運行。一旦我們達到五以上,我們會得到以下錯誤。我已經嘗試了幾件事,但還沒有找到解決方案。任何幫助,你可以提供將不勝感激 謝謝連接當前狀態如何關閉,如果它尚未關閉

System.InvalidOperationException:ExecuteNonQuery需要一個開放和可用的連接。連接的當前狀態已關閉。 (String method, at System.Data.SqlClient.SqlCommand.ValidateCommand(String method,Boolean async) ) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at SQLLogger.WriteLogLine(String LogEntry,String methodName,String jobID, Boolean CustomerNotification,Nullable`1 iQuantity) at MainModule.Main()

string ApplicationName; 
     Guid AppRunid; 


     SqlConnection db; 



     public SQLLogger(string _ApplicationName, Guid _AppRunID,string LogDbConnectionString) 
     { 
      ApplicationName = _ApplicationName;   
      AppRunid = _AppRunID; 

      db = new SqlConnection(LogDbConnectionString); 
      db.Open(); 
     } 

     public void WriteLogLine(string LogEntry ,string methodName,string jobID =null,Boolean CustomerNotification=false,int? iQuantity=null) 
     { 


      SqlCommand SQL = new SqlCommand("LogApplicationEvent", db); 
      SQL.CommandType = CommandType.StoredProcedure; 
      SQL.Parameters.AddWithValue("@appName", ApplicationName); 
      SQL.Parameters.AddWithValue("@message", LogEntry); 
      SQL.Parameters.AddWithValue("@jobID", jobID); 
      SQL.Parameters.AddWithValue("@AppRunID", AppRunid); 
      SQL.Parameters.AddWithValue("@CustomerMessage", CustomerNotification); 
      SQL.Parameters.AddWithValue("@MethodName", methodName); 
      SQL.Parameters.AddWithValue("@Quantity", iQuantity); 
      SQL.ExecuteNonQuery(); 

      Console.WriteLine(String.Format(DateTime.Now.ToString(), "yyyy/MM/dd HH:mm:ss") + " " + LogEntry +" "+jobID+" "+ iQuantity.ToString()); 
     } 
+0

具有線程安全性的單線圖案就是您要查找的內容 – Miller

回答

0

使記錄器類靜態並使SqlConnection靜態。我認爲你的代碼中有太多的對象。將其設置爲靜態,以便每種用法都存在。使WriteLogLine也是靜態的,並確保連接在任何代碼中都沒有關閉。

相關問題