Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Экземпляр класса и переменные в этом классе


Автор: Laprado 28.12.2006, 11:43
Есть метод Main в котором создается экземпляр класса. В классе находится метод и переменная для подключения к БД. Пытаюсь подключиться к БД через переменную экземпляра класса в методе main.
Подключение проходит нормально, только при удаленном вызове метода Access вылазит исключение, что перем conn == null, хотя она определена была через метод Main. 
Я так понял, при создании экземпляра класса, переменные которые я использую через экземпляр - это одно, а что есть в самом классе - это другое. Как тут быть? 

Код

static void Main(string[] args)
        {
            ServiceHost host = null;
            Core cr = null; // экземпляр класса Core

             if (host != null)
            {
                Console.WriteLine("---- Соединение с БД...");
                cr = new Core();
                cr.Connect(); // метод коннекта к БД

                if (cr.conn != null) // переменная соединения
                    Console.WriteLine("---- ОК : " + cr.conn.ConnectionString.ToString());
                else
                {
                    host.Close();
                    host = null;
                    Console.WriteLine("---! Сервер остановлен");
                }
            }
 

Core.cs

Код

class Core : ICore
    {
        private static Object EnterObj = new Object();
        ICallback callback = null;
        bool ok = false;


        string DBstr = "server=localhost; user id=root; password=111; database=wcf; pooling=false";
        public MySqlConnection conn = null;


        public void Connect()
        {
            try
            {
                if (conn != null)
                {
                    conn.Close();
                    conn = null;
                }
                else
                {
                    conn = new MySqlConnection(DBstr);
                    conn.Open();
                }
            }
            catch (Exception exp)
            {
                Console.WriteLine("void Connect ::: " + exp.Message);
                conn = null;
            }
        }


 public void Access(string name, string password)
        {
            string qwery = String.Format("SELECT * FROM users WHERE User = '{0}' and Password = '{1}'", name, password);
            MySqlCommand cm = new MySqlCommand(qwery, conn);
            MySqlDataReader dr = null;

            lock (EnterObj)
            {
                try
                {
                    dr = cm.ExecuteReader();

                    while (dr.Read())
                    {
                        if ((string.Compare(name, dr.GetString(1), true) == 0) && (password.Equals(dr.GetString(2))))
                        {
                            ok = true;
                        }
                    }

                    dr.Close();
                }
                catch (Exception exp)
                {
                    Console.WriteLine("void Access ::: "+exp.Message); // Ругается, что перем conn == null
                }
            }

            callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            callback.Success(ok);
        }

Автор: ivashkanet 28.12.2006, 11:53
Цитата(Laprado @  28.12.2006,  10:43 Найти цитируемый пост)
Я так понял, при создании экземпляра класса, переменные которые я использую через экземпляр - это одно, а что есть в самом классе - это другое. Как тут быть? 

Ничего не понятно  smile 

Но, по идее, все должно быть нормально, 
при условии, что ты используешь тот же экземпляр класса и в дальнейшем
Цитата(Laprado @  28.12.2006,  10:43 Найти цитируемый пост)
cr = new Core();

Если нет, то посмотри в сторону 
Код

public static MySqlConnection conn = null;


Тогда у тя будет один экзэмпляр  conn на все элементы класса  smile 

Автор: Laprado 28.12.2006, 12:38
conn используется в разных классах, в данном случае в main и Core. Если  я в main создам экземпляр класса Core и подключусь через нее к БД, то в main все будет нормально, а в Core она так и останется cо значением null. Надо, чтобы она во всех классах приняла одно и тоже значение.
Если написать 
Код

public static MySqlConnection conn = null;
 
то, получается, в других классах conn использовать нельзя.

Автор: ivashkanet 28.12.2006, 12:41
Цитата(Laprado @  28.12.2006,  11:38 Найти цитируемый пост)
то, получается, в других классах conn использовать нельзя.

Почему? Можно smile 

Но во первых: обращаться к нему нужно Core.conn
а во вторых: я бы снизил уровень доступа к этому полю до protected 
Цитата(Laprado @  28.12.2006,  11:38 Найти цитируемый пост)
Надо, чтобы она во всех классах приняла одно и тоже значение.

Тогда только static  smile 

Автор: Laprado 28.12.2006, 12:55
Цитата(ivashkanet @ 28.12.2006,  12:41)
обращаться к нему нужно Core.conn

Не знал, спасибо! Теперь все работает! smile

P.S. занес Вас в свой "черный" список, кому plus дать, после набора 100 постов  smile 

Автор: ivashkanet 28.12.2006, 13:00
Цитата(Laprado @  28.12.2006,  11:55 Найти цитируемый пост)
Не знал

Статический член общий для всех, поэтому относиться к классу, а не к конкретному элементу.
Цитата(Laprado @  28.12.2006,  11:55 Найти цитируемый пост)
спасибо

Заходи еще  smile 
Цитата(Laprado @  28.12.2006,  11:55 Найти цитируемый пост)
Теперь все работает!

Неплохо бы пометить тему решенной
Цитата(Laprado @  28.12.2006,  11:55 Найти цитируемый пост)
 Вас 

НАС????  smile  smile  smile 

Автор: Laprado 28.12.2006, 14:15
Цитата(ivashkanet @ 28.12.2006,  13:00)
НАС????  smile  smile  smile

Ваз smile Уже несколько человег, время тратят, помогают, а плюз не стоит, не хорошо   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)