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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с Б.Д. Access через класс, Помогите разобраться 
:(
    Опции темы
kirillga
Дата 13.12.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Использую класс
Код

using System.Configuration;
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Data.SqlClient;

namespace WorkstaitionVTB
{
    class clAccessDb
    {
        # region Declaration
        private OleDbCommand dbCmd;
        private OleDbConnection dbCon;
        private OleDbDataAdapter dbDa;
        private DataSet ds;
        private DataTable dt;
        private DataRow dr;
        private string conStr;
        # endregion

        public clAccessDb(string mdb)
        {
            conStr = "provider=microsoft.jet.oledb.4.0; data source=" + mdb;

            intmdb();
        }

        private void intmdb()
        {
            try
            {
                dbCon = new OleDbConnection();
                dbCon.ConnectionString = conStr;
                dbCmd = new OleDbCommand();
                dbCmd.Connection = dbCon;
                dbDa = new OleDbDataAdapter(dbCmd);
                ds = new DataSet();
                // uitbreibaar met andere initializatie
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("init fout :" + ex.Message, "fout init dataset");
            }
        }

        public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql;// +" where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql)
        {
            ds.Tables[tabelNm].Clear();
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql, bool isnew)
        {
            if (!isnew) ds.Tables[tabelNm].Clear();
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);
        }

        public void doNonQuery(string sql)
        {
            try
            {
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.ExecuteNonQuery();
                dbCon.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("ExNonQuery fout :" + ex.Message, "fout Quary");
            }
            finally
            {
                dbCon.Close();
            }
        }

        public ConnectionState status()
        {
            return dbCon.State;
        }

        public DataSet DS
        {
            get
            {
                return ds;
            }
            set
            {
            }
        }

    }
    
}

непойму как в коде формы положить результат в comboBox и правильно вооще я делаю
в коде формы пишу так 
Код

clAccessDb AccDB = new clAccessDb("D:\\VTB.mdb");
            AccDB.initDataSet("spravochnik_sistem","SELECT name_system FROM spravochnik_sistem WHERE type_system=0");

Помогите разобраться какие варианты есть для этой задачи.
ЗАРАНЕЕ БЛАГОДАРЮ.
PM   Вверх
thomas
Дата 13.12.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



kirillga
Приветствую на форуме.  smile 
Как я понял, пишем на C#. Значит и примеры будем приводить тоже в C#.
В классе формы перед конструктором формы сделать декларацию
Код

Private clAccessDb AccDB;

Модификатор нужен для того чтобы определить видимость экземпляра класса. В данном случае он будет виден только в этой форме.
Далее в событии загрузки формы мы инициируем экземпляр класса
Код

private void Form1_Load(object sender, EventArgs e)
        {
            AccDB = new clAccessDb("D:\\VTB.mdb");
        }

После этого в любом месте формы можно вызывать методы и свойства экземпляра нашего класса.
Я так понял, что на форме есть ComboBox, в который нужно загрузить наименования систем из таблицы в БД.
Для этого нам надо создать табличку в ДатаСет, которая будет содержать эти наименования. Наверное желательно в отсортированном виде.
И если мы хотим видеть эти наименования в  ComboBox сразу при загрузке формы, то мы должны вставить следующий код в обработчик события загрузки формы.(в добавок к уже имеющемуся)
Код

string sql = "SELECT name_system FROM spravochnik_sistem ORDER BY name_system";
AccDB.fillDataSet("system", sql, true); // так как такой таблицы еще нет, воспользуемся перегруженным методом и укажем третий параметр.
//в ДС создана таблица с именем "system", которая содержит отсортированные наименования систем. Теперь загрузим их в  ComboBox
foreach (DataRow dr in AccDB.ds.Tables["system"].Rows)
            {
                ComboBox1.Items.Add(dr["name_system"]); 
            }

таким образом код обработчика загрузки формы примет вид:
Код


private void Form1_Load(object sender, EventArgs e)
        {
            AccDB = new clAccessDb("D:\\VTB.mdb");

            string sql = "SELECT name_system FROM spravochnik_sistem ORDER BY name_system";
            AccDB.fillDataSet("system", sql, true);

            foreach (DataRow dr in AccDB.ds.Tables["system"].Rows)
            {
                ComboBox1.Items.Add(dr["name_system"]); 
            }
        }


Успехов.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
kirillga
Дата 14.12.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ОГРОМНОЕ СПАСИБО ВСЕ ЗАРАБОТАЛО

Но появилось несколько вопросов что выполняет этот код в классе
Код

public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql;// +" where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }



И второй вопрос при использование такого кода 
Код

AccDB = new clAccessDb("D:\\VTB.mdb");
            string sql;
            sql = "SELECT name_system FROM spravochnik_sistem WHERE type_system=20";
            AccDB.fillDataSet("spravochnik_sistem", sql, true);
            foreach (DataRow dr in AccDB.DS.Tables["spravochnik_sistem"].Rows)
            {
                comboBox1.Items.Add(dr["name_system"]);
            }

для чего нужно переполнение??? и нужен ли вообще вот этот код в классе????
Код

public void fillDataSet(string tabelNm, string sql)
        {
            ds.Tables[tabelNm].Clear();
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);
        }


PM   Вверх
thomas
Дата 14.12.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



kirillga
Приветствую.
Представь ситуацию, надо заполнить накладную.
Для этого есть две таблицы в БД(одна отображает общие данные о ней, а вторая детали, т.е. какой товар сколько по какой цене) Понятно?
Так вот зачем нам тащить из базы в дата сет данные из таблицы которая содержит строки всех накладных.
Нам нужна структура этой таблицы. Верно? Поэтому мы и создаем пустую таблицу в Датасете, структура которой идентична таблице в БД.
Для этого к запросу селект присоединяется не выполнимое условие. В результате таблица есть, а данных в ней нет.  smile  smile 
Привязываем эту таблицу к DataGridView и пользователь начинает заполнять данные на проданный товар. Потом эти данные переносяться в БД.

Второй вопрос.
Это не переполнение. Так как таблицы еще нет в ДС, то соответственно при попытке очистить таблицу которой нет выскочит исключение.
Соответственно сделан еще параметр указывающий: true таблица новая, false таблица уже есть и ее надо очистить. Поэтому был переопределен основной метод.
Который служит для следующего:
Если таблица в ДатаСет уже есть, но в это время в БД произошли изменения, то нам надо их получить и в ДатаСЕт.
Потому сначала таблица очищается и тут же заполняется свежими данными из БД.

Есть вопросы пиши.
Успехов.  smile 

Это сообщение отредактировал(а) thomas - 14.12.2007, 15:06


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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