2010-10-07 65 views
1

我有一个长时间运行的程序,每5分钟执行一次mySQL-Queries(定时线程)。它运行约10小时后的引发NullReferenceException用下面的堆栈跟踪:MySqlClient.NativeDriver中的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()时进行处理。有人能告诉我我做错了什么吗?

回答

2

我建议你离开的连接处理,以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

+0

当调用MySQL-Class的构造函数时,什么反对创建连接? – 2010-10-07 07:46:57

+0

到数据库的连接字符串。 – 2010-10-07 07:48:47

+0

你能解释一下吗?我的连接字符串存储在设置文件中。连接存储在一个类变量中,并通过connection = new MySqlConnection(Settings.Default.ConnectionString)创建; – 2010-10-07 07:55:32