C # соединение становится нулевым - PullRequest
2 голосов
/ 13 июля 2010

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

 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());
    }

Когда я делаю ответ. Записать соединение будет пустым, почему?

Заранее спасибо!

Ответы [ 5 ]

7 голосов
/ 13 июля 2010

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

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 голосов
/ 13 июля 2010

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

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

this.Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString);
0 голосов
/ 13 июля 2010

В конструкторе MysqlAccess вы назначаете новую локальную переменную:

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

... затем вы ссылаетесь на свойство, имя которого совпадает с именем локальной переменной:

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

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

0 голосов
/ 13 июля 2010

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

public MysqlAccess()
{
    Connection=new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString);
}
0 голосов
/ 13 июля 2010

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

public MysqlAccess()
{

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


}

Попробуйте

public MysqlAccess()
{

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


}
...