Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работает GUI с БД, немогу разобраться 
V
    Опции темы
Fazil6
Дата 27.8.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Здравствуйте.

Подключаюсь в БД Oracle. 
Написал класс Oracle и в нем
Код


public bool Connect(DB_parameters p)
    {
        Close();

        OracleConnectionStringBuilder builder =
                    new OracleConnectionStringBuilder();
        
        builder["Load Balance Timeout"] = Consts.ORACLE_TIMEOUT;
        builder["Server"]               = p.db;
        builder["user id"]              = p.user;
        builder["password"]             = p.pasw;
        builder["Unicode"]              = Consts.UNICODE_USE;
          
        // connection - static OracleConnection в этом классе
        connection = new OracleConnection(builder.ConnectionString);
   
        try
        {
            connection.Open();
            ds = new DataSet("TestPlan");  // ds - static  DataSet в этом классе
            connected = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            connected = false;
        }

        return Connected();
    }

запросы к БД делаются такой функцией
Код

public static bool QueryData(string sql, string ds_tab)  // метод для запроса Select
    {
        if (!Connected())
        {
            ErrorMessage = Consts.ORACLE_NOT_CONNECTED;
            return false;
        }
        
        try
        {
            OracleCommand command = new OracleCommand(sql, connection);
            OracleDataAdapter da = new OracleDataAdapter(command);
            da.Fill(ds, ds_tab);
        }
        catch (Exception e) { ErrorMessage = e.Message; return false; }

        
         return true;
        
    }

при этом всем я могу получить вот так DataSource
Код

public static BindingSource GetBindingSource(string ds_tab)
    {
        return new BindingSource(ds,ds_tab);
    }


потом на главной форме я вывожу полученные данные в грид
Код

private void connectToolStripMenuItem_Click(object sender, EventArgs e)
        {
 //bla - bla к делу не относится
           if(!o.Connect(db_sel.GetSelectedData())) MessageBox.Show("Неправильные значения строки подключения");

            if(!Oracle.QueryData(Consts.QUERY_TEST_SQL, Consts.APP_TEST_TABLE))
            {
                MessageBox.Show(Oracle.GetErrorStr());
                return;
            }
          
            testView1.DataSource = Oracle.GetBindingSource(Consts.APP_TEST_TABLE); // получил и все отобразилось
        }

дальше никак не могу втыркнуть как обрабатывать перемещение по этому моему гриду ??? т.е. как сделать обработчик(вообще какое событие какого класа это должно быть) когда пользователь в гриде переходит по записям?

ЗЫ. Я человек новый в дотнет и любая конструктивная критика приведенного кода приветствуется. Вполне возможно, что я вообще, как грится, через ж@nу пытаюсь сделать...

Это сообщение отредактировал(а) Fazil6 - 27.8.2007, 11:34
PM MAIL   Вверх
ivashkanet
Дата 27.8.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



Fazil6, во первых это вопрос по WinForms, a не по базам данных (судя по всему, ты данные получаешь, хоть и немного странным образом). 

Дальше, если у тебя DataGridView контрол (не могу точно сказать что такое testView1), то у него есть событие CurrentCellChanged которое тебе поможет:
Код

        private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentCell != null)
            {
                int currentRowIndex = dataGridView1.CurrentCell.RowIndex;
                int currentColumnIndex = dataGridView1.CurrentCell.ColumnIndex;

                label1.Text = string.Format("Current cell is ({0}, {1})", currentRowIndex, currentColumnIndex);    
            }
        }


P.S. 
Цитата(Fazil6 @  27.8.2007,  11:31 Найти цитируемый пост)
Я человек новый в дотнет и любая конструктивная критика приведенного кода приветствуется. Вполне возможно, что я вообще, как грится, через ж@nу пытаюсь сделать...

Ну немного нетривиально, так сказать smile
Подключение к БД: в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.
Я делаю так:
Код


            OracleConnection connection = getConnection();
            OracleCommand command = connection.CreateCommand();
            command.Connection = connection;
            command.CommandText = queryString;

            try
            {
                connection.Open();

                OracleDataReader reader = command.ExecuteReader();
                 ...
                 ...
            }
            finally
            {
                connection.Close();
            }


В данном случае можно обойтись и без БД. 
Для тестов я наваял следующий код:
Код

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = new DataTable("My table");
            table.Columns.Add("ID");
            table.Columns.Add("Value");

            DataRow row ;

            for (int i = 0; i < 100; i++)
            {
             row = table.NewRow();
             row[0] = i;
             row[1] = "Value of row N " + i.ToString();
             table.Rows.Add(row);
            }


            dataGridView1.DataSource = table;
        }

P.P.S. Удачи в освоении .Net ;-)

Добавлено через 1 минуту и 15 секунд
Ещё можно ознакомиться Сколько коннектов использовать (правда ни к чему толковому мы там так и не пришли smile )
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 27.8.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Fazil6, во первых это вопрос по WinForms, a не по базам данных (судя по всему, ты данные получаешь, хоть и немного странным образом). 

а в чем собственно странность? 
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Дальше, если у тебя DataGridView контрол (не могу точно сказать что такое testView1), то у него есть событие CurrentCellChanged которое тебе поможет:

действительно это DataGridView и CurrentCellChanged я видел, но как я понял мне придется в его обработчике отслеживать сменилась текущая запись или нет ибо обрабатывать нужно именно переход по записям, и мне думалось, что логично иметь некое событие для смены текущей записи.
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Подключение к БД: в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.

непонял, к чему это ?

Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
В данном случае можно обойтись и без БД. Для тестов я наваял следующий код:

тут тоже не понял : в каком "данном случае" и "Для тестов" чего?


Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
P.P.S. Удачи в освоении .Net ;-)

спасибо конечно...
PM MAIL   Вверх
Fazil6
Дата 28.8.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



вобщем пришел к такому варианту
Код

private void testView1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (current_row == testView1.CurrentRow)  return;

            current_row = testView1.CurrentRow;

          ...
        }

PM MAIL   Вверх
ivashkanet
Дата 28.8.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
а в чем собственно странность? 

Один метод обращения к базе (см. мой пример) ты растянул на 3, с локальными переменными...
Причём коннекшин к базе у тя всегда установлен хотя это делать не обязательно (и даже расточительно) так как 
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.

Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
в каком "данном случае"

Данный случай -- задача заявленная в первом посте: 
Цитата(Fazil6 @  27.8.2007,  11:31 Найти цитируемый пост)
как обрабатывать перемещение по этому моему гриду
 Которая никоем образом не относится к базам данных.
Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
"Для тестов" чего?

Для тестов твоей задачи (я и знать не знал, как называется нужное тебе событие).
Цитата(Fazil6 @  28.8.2007,  01:19 Найти цитируемый пост)
вобщем пришел к такому варианту

Именно такой код я себе и представлял.
Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
CurrentCellChanged я видел, но как я понял мне придется в его обработчике отслеживать сменилась текущая запись или нет ибо обрабатывать нужно именно переход по записям, и мне думалось, что логично иметь некое событие для смены текущей записи.

Зачем иметь специализированное событие, если есть более общее, отлично точащееся под узкую задачу? (риторический вопрос).
PM MAIL WWW ICQ   Вверх
deviLoper
Дата 29.8.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.1.2006

Репутация: нет
Всего: нет



Если я праильно понял вопрос, то есть еще такой вариант:
Код

            this.BindingContext[table].PositionChanged += new EventHandler(Position_Changed);

И дальше обрабатываеш событие Position_Changed. Это и есть событие перехода между записями. BindingContext[table] это экземпляр класса BindingManagerBase, который сообственно и отвечает за связь между DataGridView и DataSet
PM MAIL   Вверх
Fazil6
Дата 30.8.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



учтем
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.