ativeDriver中的NullReferenceExcept

ativeDriver中的NullReferenceExcept

我有一个长时间运行的程序,每5分钟执行一次mySQL查询(定时线程)。在运行了大约10小时之后,抛出Null RealEngExchange异常,使用以下StAcTrace:

at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
   bei MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlDataReader.Close()
   at MySql.Data.MySqlClient.MySqlCommand.ResetReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at MyOwnProgram.Mysql.sendData(String sqlCommmand)

sendData方法如下(lockDB是Object类型)
public void sendData(string sqlCommmand) {
            try {
                using(MySqlCommand command = connection.CreateCommand()) {
                    command.CommandTimeout = 5;
                    command.CommandText = sqlCommmand;
                    lock(lockDB) {
                        command.ExecuteNonQuery();
                    }
                }
            } catch(MySqlException e) {
                throw e;
            } catch(Exception e) {
                // do some logging
            }
        }

在调用mySQL类的构造函数时打开连接,在调用析构函数或调用dispose()时释放连接。有人能告诉我我做错了什么吗?

最佳答案

我建议您将连接处理保留到ADO.NET:

public void sendData(string sqlCommmand)
{
    using (var con = new MySqlConnection(ConnectionString))
    using(var cmd = con.CreateCommand())
    {
        con.Open();
        cmd.CommandTimeout = 5;
        cmd.CommandText = sqlCommmand;
        cmd.ExecuteNonQuery();
    }
}

您不再需要finally语句。如果需要记录某些内容,您可以添加try/catch,但请确保传播异常而不是使用它。

关于c# - MySqlClient.NativeDriver中的NullReferenceException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3879505/

10-14 16:11