【问题标题】:NullReferenceException in MySqlClient.NativeDriverMySqlClient.NativeDriver 中的 NullReferenceException
【发布时间】:2010-10-07 07:24:03
【问题描述】:

我有一个长时间运行的程序,它每 5 分钟执行一些 mySQL 查询(定时线程)。在它运行大约 10 小时后,会引发 NullReferenceException,并带有以下堆栈跟踪:

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-Class 的构造函数时打开连接,并在调用析构函数或调用 dispose() 时释放连接。谁能告诉我我做错了什么?

【问题讨论】:

    标签: c# sql mysql nullreferenceexception


    【解决方案1】:

    我建议您将连接处理留给 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,但请确保传播异常而不是使用它。

    【讨论】:

    • 在调用 MySQL-Class 的构造函数时,什么反对创建连接?
    • 数据库的连接字符串。
    • 你能详细解释一下吗?我的连接字符串存储在设置文件中。连接存储在类变量中,由 connection = new MySqlConnection(Settings.Default.ConnectionString); 创建
    • 我的意思是为什么我不能在 mysql 类的构造器中创建连接并让它在程序运行时保持活动状态?
    • ADO.NET 使用连接池。每次发送 SQL 查询时都不会创建连接。它们是从池中提取的,最好将这种处理留给框架。
    猜你喜欢
    • 2010-11-05
    • 2011-07-24
    • 2013-03-12
    • 2016-09-20
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多