我们有一个应用程序,在整个运行过程中会调用几个存储过程几千次。该应用程序使用以下SQLLogger对象作为日志记录机制。也就是说对象被实例化一次,并且在每次执行后调用WriteLogLine方法。我们最近更改了代码以在多个线程上运行。一旦我们达到5以上,我们就会收到以下错误。我已经尝试了几件事,但尚未找到解决方案。任何你能提供的帮助将不胜感激 谢谢
System.InvalidOperationException:ExecuteNonQuery需要一个开放且可用的连接。连接的当前状态已关闭。 在System.Data.SqlClient.SqlConnection.GetOpenConnection(String方法) 在System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String方法,SqlCommand命令) 在System.Data.SqlClient.SqlCommand.ValidateCommand(String方法,布尔异步) 在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,String methodName,Boolean sendToPipe) 在System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at SQLLogger.WriteLogLine(String LogEntry,String methodName,String jobID,Boolean CustomerNotification,Nullable`1 iQuantity) 在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 :(得分:0)
使logger类成为静态并使SqlConnection成为静态。我认为你的代码中有太多的对象。使其成为静态,以便每次使用时都存在。使WriteLogLine也是静态的,并确保在任何代码中都没有关闭连接。