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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Listbox & Oracle, синхронизация листбокса с таблицей из бд 
V
    Опции темы
Torrero
Дата 18.5.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



      В общем задача такая: считать таблицу из бд и вывести в листбокс...все просто... но есть одна загвоздка: при добавлении новой записи в таблицу нужно отобразить изменения в листбоксе...
      Т.е. вот что я имею в виду: Запускается приложение, из таблицы считываются данные и отображаются в листбоксе, при нажатии на кнопку добавить, запускается другая форма(при помощи ShowDialog). При помощи этой самой формы мы добавляем новую записи в таблицу, и по нажатии пимпы "ОК" эта форма закрывается(this.Close();) и активируется снова главная форма с листбоксом(при помощи Owner.Activate(); )  
       Фишка в том чтобы заставить листбокс заново считать обновленную таблицу из бд, ведь запись новую мы добавили а в листбоксе она не появилась.

Заполнение листбокса:
Код

private void UpdateCategories()
        {
            string strConResult = OrcConnection.Connect(DataSource, Login, Password);

            try
            {
                dtResults = OrcConnection.GetTable("Category_Name", "Categories");
            }
            catch (OracleException orcExc)
            {
                string ErrorMsg = " Error: " + orcExc.Message;
                MessageBox.Show(ErrorMsg);
            }
            //первый способ 
            lbCategories.DisplayMember = "Category_Name";
            lbCategories.DataSource = dtResults;
            //второй
            /*foreach (DataRow row in dtResults.Rows)
                lbCategories.Items.Add(new ListBoxItem(row, "Category_Name"));*/
        }


Добавление новой записи в таблицу
Код

private void btnOK_Click(object sender, EventArgs e)
        {
            string strConResult = OrcConnection.Connect(DataSource, Login, Password);

            string Content = "ID_seq.nextval, '" + txtCategory.Text + "'";
           
            try
            {
                OrcConnection.InsertInTable("Categories", Content);
            }
            catch (OracleException oraExc)
            {
                string ErrorMsg = " Error: " + oraExc.Message;
                MessageBox.Show(ErrorMsg);
            }

            Owner.Activate();
            this.Close()
        }


И на всякий случай выкладываю класс который используется для доступа к оракл:
Код

 class OrcConnection
    {
        static private OracleConnection orcCon;
        private static OracleCommand cmd;
        private static OracleDataAdapter da;
        private static OracleCommandBuilder cb;
        private static DataSet ds;
        private static string sql;
        private static string msg = "";

        public static string Connect(string strDataSource, string strUserId, string strPassword)
        {
            string strConResult = "";

            string orcConString = "Data Source=" + strDataSource + ";User Id=" + strUserId + ";Password=" + strPassword + ";";
            orcCon = new OracleConnection(orcConString);

            try
            {
                orcCon.Open();
            }
            catch (OracleException orcEx)
            {
                strConResult = "An error occured: " + orcEx.Message;
            }
            
            return strConResult;
        }

        public static DataTable GetTable(string column, string table)
        {
            sql = "SELECT " + column + " FROM " + table ;
            cmd = new OracleCommand(sql, orcCon);
            cmd.CommandType = CommandType.Text;
            da = new OracleDataAdapter(cmd);
            cb = new OracleCommandBuilder(da);
            ds = new DataSet();

            da.Fill(ds);
            return ds.Tables[0];
        }

        public static void CreateTable(string TableName, string TableContent)
        {
            sql = "create table " + TableName + " ( " + TableContent + " )";
            MessageBox.Show("Debug : " + sql);
            cmd = new OracleCommand(sql, orcCon);
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }

        public static void InsertInTable(string TableName, string TableContent)
        {
            sql = "insert into " + TableName + " values ( " + TableContent + " )";
            MessageBox.Show("Debug : " + sql);
            cmd = new OracleCommand(sql, orcCon);
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }

        public static void CreateSequence(string SeqName, string SeqContent)
        {
            sql = "create sequence " + SeqName + " " + SeqContent;
            cmd = new OracleCommand(sql, orcCon);
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }
    }


Очень прошу помощи а то уже пол дня мучаюсь:(

З.Ы. прошу прощение заранее за возможные обшибки, очепятки и прочееsmile... весь день у компа и мозг уже в оффлайн уходит...

З.З.Ы. также есть дополнительный вопрос не по теме, по поводу класса который используется для доступа к оракл. Только заметил что соединение открывается но нигде не закрывается. Подскажите плиз как лучше всего реализовать закрытие соединения(если конечно оно нужно)

З.З.З.Ы. поиском пользовался! нашел туеву хучу тем про листбокс, но того что мне надо не нашел!
PM MAIL   Вверх
Unlocker
Дата 18.5.2009, 23:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 2.11.2007
Где: Москва - Знаменск (Капустин Яр)

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



В связи с прочтением проблемы возник вопрос: а как осуществляется доступ к данным? 
Сколько слоев доступа к данным
2: БД -- интерфейс
3: БД -- DataSet -- интерфейс

В последнем случае все предельно просто: у ListBox'a есть свойство DataSource для связи с источником данных. Его и надо использовать.
Последовательность действий такая: соединиться с БД и заполнить твой DataSet данными; работать с локальной копией данных до тех пор пока необходимо; синхронизировать локальную копию с БД по окончании работы или в другой необходимый момент.
Свойству DataSource у ListBox'a надо присвоить имя локальной таблицы, соответственно при изменении этой таблицы в интерфейсе будут отображаться все изменения.
Для двухуровневой архитектуры все несколько сложнее, т.к. надо продумывать механизм организации оповещения интерфейса клиента об изменениях в таблицах БД на сервере.
--------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b."
PM MAIL ICQ Skype GTalk Jabber   Вверх
Torrero
Дата 19.5.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

В связи с прочтением проблемы возник вопрос: а как осуществляется доступ к данным? 

Доступ к данным осуществляется по второму способу(БД -- DataSet -- интерфейс), прочтитайте внимательно коды плизsmile...

Цитата

... синхронизировать локальную копию с БД по окончании работы или в другой необходимый момент.


насколько я помню в этом и состоит вся проблема,  как заставить синхронизировать локальную копию таблицы с бд, при закрытии одной формы и активации другой!

В общем посмотрите плиз повнимательнее код(там вроде немного), и посоветуйте плиз еще по другому вопросу: 
Учитывая существующую "бизнес-логику" (я имею в виду тот класс что используется для работы с оракл), то подскажите плиз как лучше всего осуществить закрытие соединения? ведь есть функция которая открывает его, а про закрытие я совсем забыл (большую часть этого примера нашел в интернете, я лишь дописал нужные мне функции) ...
PM MAIL   Вверх
Unlocker
Дата 19.5.2009, 14:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 2.11.2007
Где: Москва - Знаменск (Капустин Яр)

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



Цитата(Torrero @  19.5.2009,  14:34 Найти цитируемый пост)
насколько я помню в этом и состоит вся проблема,  как заставить синхронизировать локальную копию таблицы с бд, при закрытии одной формы и активации другой!

Я только не пойму: что мешает главной форме приложения синхронизировать данные с БД на основе DialogResult, который возвращает дочернее окно?

Цитата(Torrero @  19.5.2009,  14:34 Найти цитируемый пост)
Учитывая существующую "бизнес-логику" (я имею в виду тот класс что используется для работы с оракл), то подскажите плиз как лучше всего осуществить закрытие соединения? ведь есть функция которая открывает его, а про закрытие я совсем забыл (большую часть этого примера нашел в интернете, я лишь дописал нужные мне функции) ... 

Написать функцию закрытия соединения в классе OrcConnection.
А мне кажется, что надо определить ту часть приложения, которая отвечает за использование соединения (я обычно использую главное окно).
Алгоритм работы управляющей части:
  • <start>
  • Открыть соединение
  • Получить данные из БД и записать в локальный источник DataSet
  • Закрыть соединение
  • Запуская дочернее окошко, получать DialogResult, на основе которого главное окно решает, что делать с данными (например, DialogResult.Yes -> AcceptChanges(); DialogResult.No -> RejectChanges();)
    (уже на этом этапе ListBox будет отображать все необходимое, если он привязан к локальному источнику данных)
  • ...
  • Открыть соединение
  • Синхронизировать
  • Закрыть соединение
  • <end>

Цитата(Torrero @  19.5.2009,  14:34 Найти цитируемый пост)
Доступ к данным осуществляется по второму способу(БД -- DataSet -- интерфейс)

нигде не увидел объявления DataSet'a. Извиняюсь, если поторопился. А таблицы, насколько смог видеть, нетипизированные, что и навело на мысль о двухуровневой архитектуре доступа.

PS: какая версия Студии используется? все, о чем я пишу здесь обкатано на паре Visual Studio 2005 + SQL Server 2005 DevEdition
--------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b."
PM MAIL ICQ Skype GTalk Jabber   Вверх
Torrero
Дата 23.5.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спс большое все работает!огромное спасибо!

З.Ы. есть небольшой вопрос, а что происходит если у нас есть незакрытое соединение с оракл, и мы открываем новое? и если открывается новое(второе) соединение ,то можно ли как-то посмотреть количество открытых соединений, чтобы "вживую" увидеть последствия незакрытых соединенийsmile? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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