如果连接当前状态尚未关闭,如何关闭它

时间:2014-01-17 16:44:27

标签: c# sql-server-2008 database-connection

我们有一个应用程序,在整个运行过程中会调用几个存储过程几千次。该应用程序使用以下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());
        }

1 个答案:

答案 0 :(得分:0)

使logger类成为静态并使SqlConnection成为静态。我认为你的代码中有太多的对象。使其成为静态,以便每次使用时都存在。使WriteLogLine也是静态的,并确保在任何代码中都没有关闭连接。