Домой Базы данных. ADO ODBC MySQL


Все файлы проекта.(500Kb) - правый щелчок по ссылке, выбрать: сохранить объект как
Базы данных находятся в папках:
- Apteka_MySQL
- Access
- Interbase
- Paradox5_kassa5
- Paradox_kassa_

Начал с подключения - к БД Access - dbdemos.mdb.
Этот файл копировал в подкаталог ..\DATA\Access.
(относительно папки проекта  ). Имя источника - ODBC_Access1

Создаем модуль данных UnitData, в нем объект DatMod1: TDatMod1.
В этом модуле: 

1. Размещаем ADOCnct: TADOConnection. 
2. Создаем его свойство ConnectionString при помощи построителя.
(щелкаю кнопку ... справа)

Далее в окошке щелкаю Build (Построить).
Здесь нужно выбрать провайдера в соответствии с типом данных.
Для БД Access можно выбрать Microsoft Jet OLE DB Provider или
(универсальный) Microsoft OLE DB Provider for ODBC Drivers.
Щелкаем Далее - переходим на вкладку Подключение.
Здесь выбираем "использовать строку подключния", щелкаем
"Сборка".
Переходим на "Выбор источника данных". Здесь 2 закладки.
На закладке "Источник данных компьютера" можно выбрать из существующих 
источников ODBc, зарегистрированных на этом компьютере.
Нужный нам источник - БД dbdemos.mdb здесь есть (если нет - можно добавить
 - кнопка "Создать"). Выбираем его.
Далее можно задать имя, пароль (здесь - пустые).
В результате в окошке записывается строка подключения.
3. Можно еще проверить/установить начальный каталог. ( \DATA\Access)
Раскрываем список, видим, что все верно.
4. Щелкаем Проверить подключение. - успешно.
Остальные свойства не настраиваем. 
Свойство DefaultDataBase заполнилось автоматом: 
E:\XRAN_RW_MyProg\DB_DEMO\My_ODBC1\DATA\Access\dbdemos
т е путь к БД.
Настройка ADOConnection закончена. 
-----------
5. Ставим компонент ADOQ1: TADOQuery.
 Из выпадающего списка свойства Connection выбираем ADOCnct 
 (Компонент TADOTable труднее переключать на разные таблицы)
 
---------
6. Ставим компонент ds1: TDataSource - для связи с компонентами
отображениея данных (TDBGrid, TDBEdit и т д).  
 Из выпадающего списка свойства DataSet выбираем ADOQ1.
=================================
При создании каждой новой формы полезно установить: 
.Font.CharSet:= RUSSIAN_CHARSET,
.Font.Size - по вкусу (здесь 12)

На главную форму (frmADO1, модуль UnADOMain)ставим:
1. lbTables: TListBox - для выбора таблицы из БД.
Оказывается, в TADOConnection есть метод GetTableNames, помещаюший в 
объект класса TStrings список таблиц БД. Второй параметр метода:Boolean
(если true- показывает таблицы включая системные). 
Вызываю метод при показе формы, т е:

procedure TfrmADO1.FormShow(Sender: TObject);
begin
  DatMod1.ADOCnct.GetTableNames(lbTables.Items,rbAll.Checked);
end;
-----
Помещаю 2 TRadioButton:
rbAll: TRadioButton - все таблицы
rbOrdinal: TRadioButton - только простые табл.
-------
Планирую при щелчке по lbTables открыть новую форму frmShow: TfrmShow
и показать на ней выбранную таблицу (для этого там будет TDBGrid)

====================
 Создаю новую форму frmShow (модуль UnitShowTab) и размещаю на ней:
 - DBGrid1: TDBGrid. Чтобы связать его с ds1 впишем UnitData в предложение
uses модуля UnitShowTab. После этого выберем в выпадающем списке свойства 
DBGrid1.DataSource: DatMod1.ds1.
 - DBNav1: TDBNavigator. Выберем в выпадающем списке свойства 
DBNav1.DataSource: DatMod1.ds1. Разрешим показ подсказки: DBNav1.ShowHints:= true;
Можно открыть (кнопка ...) свойство Hints и заменить англ. текст русским.
Так как планирую показывать эту форму методом ShowModal, то на ней нужно 
поставить кнопку, у которой .ModalResult > 0. 
 - На панели Additional берем кнопку BitBtn1: TBitBtn,
 устанавливаем BitBtn1.Kind := bkOK, тогда BitBtn1.ModalResult = mrOK. Впишем 
BitBtn1.Caption = 'Выход'. 
Вроде бы, форма подготовлена
==============
Перейдем на форму frmADO1, создадим обработчик события - щелчок по lbTables
(т е выбор таблицы). ДЛя этого выделим lbTables, в инспекторе объектов перейдем
на закладку Events и сделаем дв.щелчок по OnClick. Тогда в редакторе будет
создан пустой шаблон для обработчика события. Вписываем необходимые действия
и получаем:

procedure TfrmADO1.lbTablesClick(Sender: TObject);
begin
  TabName:= lbTables.Items[lbTables.ItemIndex];

 with DatMod1 do
   begin
     ADOQ1.Close;
     ADOQ1.Connection:= DatMod1.ADOCnct;
     ADOQ1.SQL.Clear;
     ADOQ1.SQL.Append('SELECT * FROM '+TabName);
     ADOQ1.Open;
   end;
  frmShow.ShowModal;
end;

(TabName - глобальная переменная (string) доступная во всех модулях).

Чтобы компилятор нашел frmShow, нужно добавить модуль UnitShowTab в предложение
uses модуля UnADOMain.
==================
Для обработки произвольных запросов создаю модуль UnitQuery и в нем
описываю форму frmQuery. На этой форме устанавливаю:
  -  MemQuery: TMemo;  - для ввода запросов
  -  btnRead: TButton; - для чтения запросов из текстовых файлов;
  -  btnSave: TButton;  - для записи запроса из окошка MemQuery
                         в текстовый файл;  
  -  btnExec: TButton;  - кнопка выполнения запроса
  -  OD1: TOpenDialog;  - диалог для выбора файла запроса
  -  SD1: TSaveDialog;  - диалог для сохраниения запроса.
  -  BitBtn1: TBitBtn;  - кнопка для выхода из формы.
---------
    ConnectionString = 
      'Provider=MSDASQL.1;Persist Security Info=False;Data Source=ODBC_' +
      'Access1' 
-------------
Пробую Data Link (в ADO_2)
Этот файл как-то попал сюда:
C:\Program Files\Common Files\System\Ole DB\Data Links\DBDEMOS.udl
---- Его начинка: -----
[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=E:\Program Files\Common Files\Borland Shared\Data\DBDEMOS.mdb
---------
Перемещаю в папку проекта и меняю настройку ADOCnct

Переместил БД, поэтому настраиваю заново ADOCnct. 
Тогда:
Connect String= FILE NAME=E:\XRAN_RW_MyProg\DB_DEMO\ADO_2\DBDEMOS.udl
Provider= E:\XRAN_RW_MyProg\DB_DEMO\ADO_2\DBDEMOS.udl
Работает
----
Неясно - как создался этот DBDEMOS.udl и почему он не тот что надо (Jet.OLEDB)
=> этот путь не пойдет.
--------
Создаю хранилище для свойств ConnectionString и Provider компонента ADOCnct
- для разных моих БД
Это файл: Connections.txt 
----
Сделал ODBC-источник для kassa5: имя: Paradox_kassa5. Размещение:
E:\XRAN_RW_MyProg\DB_DEMO\DATA\Paradox5_kassa5\
Conn String:
Provider=MSDASQL.1;Persist Security Info=False;Data Source=Paradox_kassa5;
Extended Properties="DSN=Paradox_kassa5;
DefaultDir=E:\XRAN_RW_MYPROG\DB_DEMO\DATA\PARADOX5_KASSA5;DriverId=538;
FIL=Paradox 5.X;MaxBufferSize=2048;PageTimeout=5;"
Provider=MSDASQL.1
 - не работает без BDE => убрать.
--------
ODBC-MySQL источник для Аптеки есть. Подключаю его.
Политика такая: в Design Time настраиваю ADOCnct.ConnectionString:
Затем запускаю программу, читаю Connections.txt, затем щелкаю кнопку
 Добавить текущ и кнопку Сохранить. Так в файле добавится еще один
источник и его можно будет выбирать.
Но для Аптеки нужно еще запускать Denwer3 и деактивировать Kerio Firewall.
Пользователь= root pass=  (пусто)
Проверка подключения получается!
БД работает.
Переименовал папку BDE -> BDE__
Аптека - работает
Access - работает
kassa5 - не работает. Вернул BDE - работает.

--------------------
Добавляю ODBC-источник InterBase. Скачал драйвер на 
http://www.runweloads.com/cod/gen/16153prog.html
Установил. Файл KAS6.gdb поместил тут:
E:\XRAN_RW_MyProg\DB_DEMO\DATA\Interbase\
ИМя источника IntrBase_Apteka1
Работает (после перезагрузки)

================== MySQL - Apteka =========
БД привожу в соответствие с лаб2 - лаб8.

1. Создаю таб kategorii (create_kategorii.sqt) 
CREATE TABLE IF NOT EXISTS kategorii (
id_kategor smallint unsigned auto_increment primary key,
kategor char (30) not null unique)
 CHARACTER SET cp1251 COLLATE cp1251_bin ;
---------
2. Заполняю эту таблицу.(ввожу по одному INSERT)

INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 4,'аллергия'); 
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 5,'мать и дитя'); 
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 6,'слабительные');
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 7,'кандидоз');
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 8,'лечебное питание');
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 9,'антибиотики');
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 10,'анальгетики');
INSERT INTO KATEGORII (ID_KATEGOR, KATEGOR)
VALUES ( 11,'тошнотворные (kas6)');
---------------
3. Просматриваю описание табл ap_users
(запросом SHOW CREARE TABLE ap_users ).
Ввиду небольших отличий удалим прежнее описание
(Drop table ap_users) и введем новое:

CREATE TABLE ap_users (
 id_users smallint(5) unsigned NOT NULL auto_increment, 
 name char(100) NOT NULL,
 email char(30) NOT NULL UNIQUE,
 pass char(20) NOT NULL,
 ContactFio char(30) NOT NULL,
 id_Country smallint(5) unsigned NOT NULL,
 Pindex char(10) NOT NULL,
 City char(20) NOT NULL,
 Paddress char(50) NOT NULL,
 Phone char(12) default NULL,
 Fax char(12) default NULL,
 Etc char(50) default NULL,
 PRIMARY KEY  (id_users))
 ENGINE=MyISAM DEFAULT CHARSET=cp1251

----------------
 Удаляю прежние записи запросом delete from ap_users;
Затем ввожу новые данные - заполняю файл ap_users.csv
и ввожу данные при помощи запроса:
LOAD DATA LOCAL INFILE 'E:/XRAN_RW_MyProg/DB_DEMO/ADO_2/ap_users.csv' 
REPLACE INTO TABLE ap_users 
FIELDS TERMINATED BY ';' ENCLOSED BY ''
LINES STARTING BY '' TERMINATED BY '\r\n'
---
Все это на одном компе, сервер MySQL входит в состав набора Denwer3,
который можно найти на http://www.denwer.ru/
--------
Описание табл lek_list:
CREATE TABLE lek_list (
 Lek_id smallint unsigned NOT NULL, 
 Id_kategor smallint unsigned NOT NULL,
 Nazvan1 char(30) NOT NULL,
 Nazvan2 char(30) NULL,
 Nazvan3 char(40) NULL,
 Cena DOUBLE(8,2) unsigned NOT NULL,
 Key (Id_kategor), 
 PRIMARY KEY (Lek_id))
 ENGINE=MyISAM DEFAULT CHARSET=cp1251
---------
Запрос для ввода из Excel-файла lek_list.csv:
LOAD DATA LOCAL INFILE 'E:/XRAN_RW_MyProg/DB_DEMO/ADO_2/lek_list.csv' 
REPLACE INTO TABLE lek_list 
FIELDS TERMINATED BY ';' ENCLOSED BY ''
LINES STARTING BY '' TERMINATED BY '\r\n'
IGNORE 1 LINES
(Все клеточки файла lek_list.csv имеют текстовый тип.)
---------
4. создаю простейшую функцию (из окна запросов):
create function kat2() returns char(10)
begin
 Return 'Привет!';
end
-------
5. Вызываю ее запросом:
Select kat2();
результат:
+-------+
|kat2() |
|Привет!|
+-------+
6. еще функция:
create function kat3() returns char(20)
begin
 declare st char(20);
 select kategor into st from kategorii
 where id_kategor = 6;
 Return st;
end
----
7.  Вызываю ее запросом:
Select kat3();
результат:
+------------+
|kat3()      |
|слабительные|
+------------+
8. вызов системной функции:
select pi(); - работает.
-----
9. Создаю простую процедуру:
CREATE PROCEDURE kat4(out id_kat smallint, 
out kat char(20))
begin
 select id_kategor, kategor into id_kat, kat from kategorii
 where id_kategor = 6;
end 
-----
10. Вызываю ее из окна запросов:
call kat4(@id,@kat); Затем вывожу результаты:
select @id, @kat


============================================== 
Триггеры и хранимые процедуры для поддержания 
ссылочной целостности таблиц kategorii (master)
и lek_list (Detail)
--------------------
# Процедура, генерирующая ошибку
CREATE PROCEDURE gen_err()
begin
 INSERT INTO ins (id) VALUES (1);
end

# Использую эту процедуру в триггере 
# для отката удаления
---------------------
create trigger delkat before delete
on kategorii for each row
begin
 declare jj int;
 select count(*) into jj from lek_list
 where id_kategor = old.id_kategor;
 if (jj >= 1) then 
   call gen_err();
 end if;
end
 - Это работает --------------

Если изменить gen_err:

CREATE PROCEDURE gen_err()
begin
 declare jj int;
 select ss into jj from abrakadabra;
end

 - это тоже работает --------

======= 
create trigger updikat before update
on kategorii for each row 
#    если new.id_kategor <> old.id_kategor 
#    и в табл lek_list есть записи с таким old.id_kategor 
#    то update отменяется 
begin 
 declare jj int;
 if (old.id_kategor <> new.id_kategor) then
 select count(*) into jj from lek_list
 where id_kategor = old.id_kategor;
 if (jj >= 1) then 
   call gen_err(); 
 end if;
 end if;
end

-------- Пример1:(допустимо) -----------
Update kategorii 
set kategor = 'сно_сно'
where id_kategor = 11
# Такое обновление допустимо,
# выполняется
--------- Пример2:(недопустимо) -----------
Update kategorii 
set id_kategor = 23
where id_kategor = 11
# updikat нормально работает
# Т е запись не обновляется
=========================================

create trigger ins_lek before insert
on lek_list for each row
# если new.id_kategor не найдено 
# в табл kategorii, вставка отменяется.
# хорошо бы сообщение - пояснение
begin
 declare jj int;
 select count(*) into jj from kategorii
 where id_kategor = new.id_kategor;
 if (jj < 1) then 
   call gen_err();
 end if;
end

=================
Описание установки БД Аптека (MySQL) 
1. Установите Denwer3, как описано на сайте http://www.denwer.ru/
2. В папку C:\WebServers\usr\local\mysql5\data\ вставьте папку
с БД Аптека, т.е. папку Apteka_MySQL (она есть в архиве).
3. Скачайте в Инете драйвер ODBC для MySQL (1.5Mb) и установите.
4. Создайте ODBC-источник данных
  - Панель управления | Администрирование | источники данных ODBC
  - На закладке "Источники пользователя" щелкните "Добавить"
  - Выберите драйвер MySQL 
  - Введите DSN-имя по вкусу (Apteka_MySQL2)
  - SQL host = localhost 
  - MYSQL database name = Apteka_MySQL (имя папки)
  - User = root 
  - pass - пусто (вначале, если ВЫ не изменили исходный)
  - остальное пусто
----
5. Создайте Connection String, указывающий на этот источник
(в Design-time, свойство ConnectionString компонента 
ADOCnct: TADOConnection - при помощи построителя).
6. Запустите проект ADO2 и добавьте эту ConnectionString к 
списку (кнопка Добавить текущие):
  - Provider for ODBC Drivers - Далее
  - Использовать имя источника: Apteka_MySQL2
  - для входа в сервер: имя=root pass- пустой.
  - проверить подключение... должно быть ОК.
  закрыть окна: ОК,  ОК
 - компилировать и запустить проект, щелкнуть
  "Добавить текущие", Затем - "Записать".
 - Щелкнуть одну из добавленных строк, чтобу подключиться к БД.
 - ввести пароль (пустой). В правом окне  появится список таблиц.
 - Можно щелчком выбрать таблицу для просмотра.
 - Или вводить запросы.

7. После этого прога ADO2 будет подключаться к этому источнику
как и к остальным. Все другие источники придется также перенастроить
применительно к Вашей конкретной машине. 
Rambler's Top100
Hosted by uCoz