2010-07-12 2 views
2

Я разрабатываю класс для управления операциями в базе данных Mysql. У меня есть следующий код:C# connection будет null

using System; 
using MySql.Data.MySqlClient; 

public class MysqlAccess 
{ 
    private MySqlConnection pCnn; 
    public enum OperationType {Select = 1,Insert = 2,Update = 3,Delete = 4}; 

    public MysqlAccess() 
    { 

     MySqlConnection Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 


    } 

    public MySqlConnection Connection { get {return pCnn;} set {pCnn=value;} } 


    public int Connect() 
    { 
     try 
     { 

      Connection.Open(); 

      if (Connection.State == System.Data.ConnectionState.Open) 
      { 
       return 1; 
      } 
      else 
      { 
       return 0; 
      } 

     } 
     catch (Exception e) 
     { 
      return -1; 

     } 
    } 



    } 

} 

страница Загрузка код

protected void Page_Load(object sender, EventArgs e) 
    { 

     MysqlAccess DBManager = new MysqlAccess(); 


     DBManager.Connect(); 
     Response.Write("Connection State:" + DBManager.Connection.State.ToString()); 
    } 

Когда я сделать response.write соединение имеет нулевое значение, то почему?

Заранее благодарен!

+0

Благодарю вас за помощь. Кажется, я смущался с сообщением Connection =) Спасибо! –

ответ

7

Ну, это null, потому что вы никогда не инициализируете свойство Connection, и оно будет равно null, пока вы его не инициализируете. Таким образом, вместо:

public MysqlAccess() 
{ 
    // Here you are initializing a local variable 
    // that is subject to GC and goes into the void of forgetfulness 
    MySqlConnection Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 
} 

инициализации свойства:

public MysqlAccess() 
{ 
    var connectionString = ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString; 
    // The 'this' keyword is optional here and its usage is a 
    // matter of personal preference 
    this.Connection = new MySqlConnection(connectionString); 
} 

Хотя это может исправить NullReferenceException вы получаете вы должны знать, что MySqlConnection инвентарь IDisposable означает, что вы должны убедиться в том, чтобы вызвать метод Dispose во избежание утечки соединений или создания новых соединений по каждому запросу, которые могут быть особенно катастрофическими в веб-приложении.

2

В конструкторе вы не устанавливаете свойство Connection. Вы объявляете локальную переменную Connection. Итак, вы никогда не инициализируете свойство Connection.

Исправьте код, используя:

this.Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 
0

Поскольку вы объявили соединение в качестве локальной переменной здесь:

public MysqlAccess() 
{ 

    MySqlConnection Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 


} 

Попробуйте

public MysqlAccess() 
{ 

    Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 


} 
0

Измените свой конструктор:

public MysqlAccess() 
{ 
    Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 
} 
0

В MysqlAccess конструктору присвоенного новый локальные переменный:

MySqlConnection Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString); 

... потом на вас ссылаться на имущество, которое случается иметь такое же имя, как и локальные переменные:

Response.Write("Connection State:" + DBManager.Connection.State.ToString()); 

Изменение MySqlConnection Connection только Connection в конструкторе должно исправить это.