Builder+ODBC+MySQL!
Подскажите, пожалуйста, как сделать это соединение и вообще работать с базой данных через ОДБЦ. Нашла много всякой информации, но все разрозненные сведения, так что общей картины, алгоритма, не представляю :( по возможности, поподробнее... Заранее спасибо!
at http://www.mysql.com/
My e-mail: [email]lindows_ua2@mail.ru[/email], [email]lindows_ua2@bigmir.net[/email]
Write to me, and I send to You sources - How to work with ODBC.
Best regars Gleb.
==========================================
1. Пуск - Настройка - Панель управления
2. Перейти в папку - Мой компьютер
3. Перейти в папку - Панель управления
4. Перейти в папку - Администрирование
5. Запустить - Источники данных (ODBC)
6. Нажать на кнопку - Добавить
7. Выбрать драйвер
8. Написать имя источника (Имя для соединения - например MyBase1)
9. Выбрать базу данных
10. Run C++ Builder
11. Goto Tab - ADO
12. Drag to form ADOConnection
13. Click to ConnectionString
14. Select Use Connection String
15. Click button Build
16. Select provider
17. Подключение - источник данных MyBase1
18. Click button Ok
19. Click button Ok
20. Set field ADOConnection1->Connected to - true
21. Drag ADOTable to form
22. Set Connection to ADOConnection1
23. Set TableName - MYTABLE(for sample)
24. Set Activate to true
25. Switch to DataAcess
26. Drag DataSource1 to form
27. Set DataSet to ADOTable1
27. Switch to DataControls
28. Drag DBGrid to form
29. Set DataSource to DataSource1
Enjoy!
у меня оно скопировано с Мускулем работать на мой взгляд лучше без всяких ОДБЦ
Покопавшись на программерских форумах и форуме MySQL мне удалось таки собрать достаточно информации, чтобы наконец подключиться к MySQL серверу без всяких ADO, ODBC. Ни для кого не секрет, что для того, чтобы ваша программа заработала на другой машине - нужно настраивать DSN в ODBC, а для MySQL сервера на эту машину еще нужно поставить специальный компонент. Можно конечно включить инструкцию для пользователя как настраивать DSN, а также включить тот самый MySQL ODBC драйвер и наверно это будет неплохо в случае, если вы решили заработать денег на тех.поддержке. Далее идет инструкция "Step By Step", все манипуляции проделывались на BCB6.0. Для начала нужно скачать сам MySQL. Мой архив назывался так: mysql-noinstall-6.1.7-beta-win32 (у вас наверно будет поновее). Убедитесь, что вы запустили и настроили MySQL сервер, а также имеете права администратора на нем
Начнем.
1. Копируем файл из папки lib\opt:
libmysql.dll
в отдельную папку - for_bcb\lib
2. Запускаем командную строку (cmd), переходим в папку где лежит implib:
c:\>n:
n:\>cd N:\Program Files\Borland\CBuilder6\Bin
n:\Program Files\Borland\CBuilder6\Bin>implib -c I:\for_bcb\lib\opt\libmysql.lib I:\for_bcb\lib\opt\libmysql.dll
3. Копируем папку include в папку for_bcb, находим строку:
#define my_socket SOCKET
и меняем ее на:
#define my_socket UINT_PTR
4. Создаем новый проект.
5. Кидаем на форму Button1 и ListView1.
6. Ставим свойство ListView1
ViewStyle = vsReport.
7. Жмем Shift+F11 (Project->Add To Project).
Выбираем Files of Type->lib, переходим в директорию for_bcb\lib
и выбираем файл libmysql.lib.
8. Жмем Ctrl+Shift+F11 (Project->Options). Выбираем вкладку "Directories/Conditional".
Жмем на кнопки с тремя точками в Include Path и Library Path.
В Include Path выбираем директорию for_bcb\include. В Library Path for_bcb\lib.
9. Сохраняем проект.
10. Добавляем две строчки в исходнике (F12):
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#define __LCC__ // эту и
#include <mysql.h> // эту
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Копируем for_bcb\lib\libmysql.dll в папку куда будет сохраняться скомпилированный
exe файл (обычно в той же директории что и файлы проекта, если речь не о BDS2006)
11. Пример приложения. Не забудьте изменить в коде логин и пароль на свои данные (администраторские). Возможно потребуется также поменять адрес сервера localhost на ваш IP. Программа выполняется SQL запрос к базе данных MySQL и выводит все данные из таблицы `db`
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MySQLpmain.h"
#define __LCC__
#include <mysql.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
MYSQL *Con;
MYSQL_RES *Res;
MYSQL_ROW Row;
MYSQL_FIELD *Fields;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Con=mysql_init(Con);
Con=mysql_real_connect(Con,"localhost","root","123456","mysql",0,NULL,0);
if(!Con) ShowMessage("Can not connect.");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Con){
ListView1->Items->BeginUpdate();
ListView1->Clear();
AnsiString query="SELECT * FROM `mysql`.`db`;"; // magic string ;)
mysql_real_query(Con,query.c_str(),query.Length());
int f=mysql_errno(Con);
if(f==0){
Res=mysql_store_result(Con);
int CountOfColumns=mysql_num_fields(Res);
Fields=mysql_fetch_fields(Res);
for(int i=0;i<CountOfColumns;i++){
ListView1->Columns->Add();
ListView1->Columns->Items->Caption = Fields.name;
}
while ((Row = mysql_fetch_row(Res))){
TListItem *ListItem = ListView1->Items->Add();
for(int j=0;j<CountOfColumns;j++){
if (j == 0){
ListItem->Caption = Row[j];
}else{
ListItem->SubItems->Add(Row[j]);
}
}
}
ListView1->Items->EndUpdate();
}else{
ShowMessage("Error #: " + IntToStr(f) + char(13) + "Message: " + mysql_error(Con));
}
}
}
//---------------------------------------------------------------------------
Спасибо большое за помощь, соединение с базой данных выполнено, но возникла проблема с кириллицей, текстовые данные выводятся абракадаброй... В Mysqlе кодировка cp1251.
http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
In MySQL type:
mysql>set CHARACTER SET cp1251_koi8;
mysql>use имя твоей базы данных;
mysql>insert into member values('Киев',044);
mysql>select * from member;
ENJOY!
My site: http://oxygen2017.narod.ru
В MySQL кодировка стоит ср1251, и проблем нет. В Buildere, когда вывожу свою таблицу, вместо русских символов иероглифы!.. А в самой базе все нормально выводится... Вот в чем проблема...
Структура БД:
ТОВАР (Id, название, цена) Id первичный ключ
КЛИЕНТ (Id, ФИО) Id первичный ключ
ПРОДАЖА (Id-товара, Id-клиента, дата, количество) Id-товара, Id-клиента –первичные ключи.
Пишу приложение на Билдере.
Вопрос: как сделать так, чтобы при внесении данных в столбец Id-товара таблицы ПРОДАЖА появлялся список товаров из таблицы ТОВАР, чтобы товар можно было выбрать,а не набирать вручную?
Читал про cbsAUTO и PickList, но там этот список (чтобы он потом появлялся) надо предварительно набить вручную,а не брать данные из таблиы...
Кто работал с Билдером, подскажите, как это сделать?
Народ!! Неужели никто не создавал приложений для БД на Билдере? Отзовитесь, пожалуйста!!
всмысле ты уже забил данные и тогда появилось название товара, или когда ты фокус на поле с id товара переводишь тогда появляется список....
поясни plz.
попробуй серверу MySQL (из своей программы) после соединения сразу же послать комманду:
SET CHARACTER SET cp1251 (ну или как-то так... не вспомню точно, но вроде бы должно проканать)
:)
Если кто работал с Access, там для полей таблицы есть опция "подстановка", с помощью которой можно в поле одной таблицы (обычно дочерней) помещать данные другой (родительской таблицы). Т.о., при заполнении таблицы ПРОДАЖА значения полей "Id-товара" и "Id-клиента" мы выбираем из соответствующих списков а не набиваем вручную.
Не могу никак найти, как это реализовать на Билдере..
и при выборе из него подставляй ID товара в нужное тебе поле (сильно ногами не пинать если опять не понял тебя ;) )
PS: я сегодня что-то сплю... :(
Но наверно мы опять друг друга не поняли...:)
Ладно, попозже попробую объяснить еще подробнее :)
а если нет, то можешь написать на мыльник [email]this_hell@ngs.ru[/email] там почитаю получше и отвечу )))))
Один компонент ADOQuery может выполнить только один запрос?? или я что-то неправильно поняла... Если нет, то как с помощью ADOQuery выполнить несколько запросов?
1. Записать в SQL текст первого запроса.
2. Запустить/открыть первый запрос
3. Считать результат во временную переменную
4. Закрыть запрос.
5. Записать в SQL текст второго запроса.
6. Указать значение параметра
7. Запустить/открыть второй запрос
А лучше всего, использовать два объекта AdoQuery. Создать AdoConnection, настроить в нём подключение, и использовать его другими компонентами AdoDB
да уж... а если нужно написать 20 запросов к базе, значит, должно быть 20 компонентов ADOQuery??!! каждый из которых к базе надо подключить!
Если есть несколько компонентов, то нет нужды настраивать каждый. Создаётся объект AdoConnection, в который пишется ConnectionString. А потом его адрес присваисвается свойству Connection остальных компонентов.
Monika, напиши пожайлуста как ты решила проблему с абракадаброй в билдере. запарился прям
А сделать чтоб и в базе хорошо и в билдере не получилось...
А вообще у меня в группе один парень тоже мутил приложение в билдере, а база мускл, так он уверял,что такой проблемы у него не было! что везде все по-русски. НО! пришел показывать преподу на преподском компе, запустил и у него в билдере абракадабра!! а сервер мускл тот же! он сам устанавливал!
Посмотрю что получится
Не знаю или тебя это еще интересует. Решение этой проблемы такое: надо сразу после подключения к мускулу послать команду
SET NAMES 'cp1251'
(Тень Пса советовал в этой теме, только ошибся в формулировке)
она определяет кодировку подключения. все начинает работать нормально. если этого не сделать то потом могут возникнуть проблемы с командами типа ORDER.
default-character-set=cp1251
Но самое интересное, что запросы с ORDER BY работают!! сортирует как надо! :)