NullReferenceException в MySqlClient.NativeDriver - PullRequest
1 голос
/ 07 октября 2010

У меня есть долго работающая программа, которая выдает некоторые запросы MySQL каждые 5 минут (поток по расписанию). После примерно 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 (). Может кто-нибудь сказать мне, что я сделал не так?

1 Ответ

2 голосов
/ 07 октября 2010

Я бы порекомендовал вам оставить обработку соединения для 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, если вам нужно что-то зарегистрировать, но обязательно распространять исключение и не использовать его.

...