Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Ошибки при попытке подключения к MySQL.


Автор: Mal Hack 12.11.2004, 15:40
Уже два часа юзаю поиск тут и на mysql.ru но ниче найьт не могу..
Трабла такая...
Используя dbExpress
создаю соединение с mysql SQLConnection1.
Вот код из DFM'a.
Код
 object SQLConnection1: TSQLConnection
   ConnectionName = 'MySQLConnection'
   DriverName = 'MySQL'
   GetDriverFunc = 'getSQLDriverMYSQL'
   LibraryName = 'dbexmysql.dll'
   Params.Strings = (
     'DriverName=MySQL'
     'HostName=127.0.0.1'
     'Database=lesson'
     'User_Name=root'
     'Password='
     'BlobSize=-1'
     'ErrorResourceFile='
     'LocaleCode=0000')
   VendorLib = 'libmysql.dll'

Дык вот, когда пытаюсь Active сделать = TRUE через инспектор объектов - получаю....
1. libmysql.dll not found. (Понапихал куда только можно... ив /bin и в папку с проектом и в c:/windows и /system32)...
2. Очищаю Vendorlib, получаю DLL/Shared Library name not set.
Пробовал и полные пути написать - та же фигня..

Как от всего этого избавиться понять никак нет могу...
С самим MySQL через PHP работаю уже года два.
С базами из Delphi работал только с 7 Paradox'ом...

Еще один такой момент...
В результате каких-то монипуляций иногда выскакивает еще одна вещь что-то типа "Невозможно загруить драйвер" (или функцию драйвера)...

Автор: <Spawn> 12.11.2004, 20:55
Используй компоненты ZeosAccess

Автор: Mal Hack 12.11.2004, 21:14
<Spawn>
Дело в том, что программу надо будет компилить на многих компах, гд возможно не удастся установить данное расширение...
(задание по практике в учеьном заведении).
Поэтому хочется обойтись стандартными средствами...
Цитата
Используй компоненты ZeosAccess

TMySQL это оно?

Автор: Kesh 13.11.2004, 01:08
Mal Hack насколько я понял - нет... поищи ZeosDBO

http://www.zeoslib.net/

Автор: Mal Hack 13.11.2004, 10:20
Если в этом покопаться, то можно рпзобраться.. Но повторюсь, надо сделатьна стандартном dbExpress'e...
Приложение - просто практика, никуда дальше не пойдет, поэтому надо сделать проще...
Все-таки инитересует вариант работы именно с dbExpress..

Автор: Mal Hack 14.11.2004, 00:38
Уф, ну и многих же людей я запряг со своей проблемой...
Итак, вопрос решился...
Рассказываю.
1. В папочку с проектом кладем libmySQL.dll от 3 версии MySQL, от 4 будет писать unable to load....
2. Предположим, что на форме есть 3 Edit'a для хоста, логина, пароля и базы.
3. Объявляем Connection: TSQLConnection.
4. При нажатии на кнопку соединения делаем..
Код
// Create Connection
Connection := TSQLConnection.Create(Application);
 with Connection do  
 begin  
   ConnectionName := 'Connection';  
   DriverName := 'MySQL';
   LibraryName := 'dbexpmysql.dll';
   VendorLib := 'libmySQL.dll';
   GetDriverFunc := 'getSQLDriverMYSQL';
   Params.Add( 'HostName=' + ConnectEditHost.Text );
   Params.Add( 'User_Name=' + ConnectEditUser.Text );
   Params.Add( 'Password=' + ConnectEditPass.Text );
   Params.Add( 'Database='  + ConnectEditBase.Text );
   LoginPrompt := TRUE;
   try
    Open;
   Except On Exception Do
    begin
     Application.MessageBox( 'К сожалению, соединиться с MySQL-сервером не удалось. Проверьте правильность ввода всех параметров.' , 'Ошибка соединения' , 0 );
     exit;
    end;
   end;
 end;

Все. К БД коннектиться... Дальше уже можно работать...

Есть еще два маленьких вопроса...
1. Соединение с базой лучше закрывать только при закрытии программы и открывать при открытии или проделывать эти операции перед выполнением каждого запроса?
Если все-таки лучше держать соединение открытым, то как во время работы программы проверить доступность сервера? Грубо говоря как mysql_ping() в PHP.
2. Как (оптимальнее и без возникновения ошибок) закрыть соединение...
Connection.Free;
DataSet.Free;
Этого будет достаточно?

Автор: Kesh 14.11.2004, 10:53
1. Лучше кон6ечно держать соединение открытым во время работы программы... Т.к. выполнение подключения перед каждым запросом - трата времени и ресурсов...
Доступность сервера можно проверить по Connection.Connected...
2. Соединение закрывается по Connection.close... Делать Free перед закрытием программы не нужно, т.к. программа при закрытии его все равно выполнит...

Автор: Mal Hack 14.11.2004, 11:53
Спасибо (+1)

Автор: Mal Hack 14.11.2004, 16:25
Появляется вот такая ошибка на Open из предыдущего кода..
Раньше она появлялась на Закрытии приложения...
http://mal-hack.net/error.gif
Что за ошибка?

Автор: Mal Hack 14.11.2004, 18:10
Я конечно дико извиняюсь, но...
От вышеупомянутого "счастья" избавился путем подмены libmySQL.dll
Но теперь вопрос в другом..
Как в:
Код

SQLDataSet := TSQLDataSet.Create( Application );
 with SQLDataSet do
  begin
   SQLConnection := Connection;
   CommandType := ctQuery;
   CommandText := 'INSERT INTO service_categories VALUES( "" , "text" ) ';
   DataSource := SQLDataSource;
   try
     Open;
   Except  On Exception do
    begin
     showmessage( '12' );
     exit;
    end;
   end;
  end;


Отловить именно момент, когда запрос не выполнился...
Поскольку при такой констркции: On Exception do (или EDataBaseError) shwmessage показывается в любом случае, даже если запрос выполняется.

Автор: Kesh 14.11.2004, 19:18
А там разве ExecSQL нету?..
Добавлено @ 19:19
Оно вместо Open - Close используется для разовых инструкций...

Автор: Kesh 14.11.2004, 19:28
Из Help по Delphi 8
Цитата
Executes a query or stored procedure that does not return a set of records.

Class
TSQLDataSet
Syntax

public function ExecSQL(ExecDirect: Boolean): Integer;


Description
Call ExecSQL to execute an SQL command that does not return a set of records. This command is a query other than a SELECT query, such as an INSERT, UPDATE, DELETE, or CREATE TABLE query.

ExecDirect indicates that the query does not need to be prepared before it is executed. This parameter can be set to true if the query does not include any parameters. When ExecDirect is false, the query will be prepared before it is executed. Even when ExecDirect is false, you can avoid preparing the query every time ExecSQL is called by setting the Prepared property to true before calling ExecSQL the first time.

ExecSQL returns the number of rows affected by the executed command. This becomes the value of the RowsAffected property.

Note: Do not use ExecSQL for commands that return data. These include any use of the ctTable command type, SELECT queries, and stored procedures that return a cursor. When the command returns data, use the Open method or set the Active property to true.



Автор: Mal Hack 14.11.2004, 19:34
Kesh есть-то он есть, н с ним в любом случае showmessage показывается...

Автор: Mal Hack 15.11.2004, 01:26
Путем проб и ошибок, осталось только одно...
При выполнении хоть Open, хоть ExecSQL, вылетает AccessViolation in address ... in module...
На сколько я понимаю это может быть из-за того, что я неправильно связал DataSet, DataSource и Grid..
Вот как делаю:
Код

SQLDataSet := TSQLDataSet.Create( Application );
 with SQLDataSet do
  begin
   Parent := MainForm;
   SQLConnection := Connection;
   CommandType := ctQuery;
  end;

SQLDataSource := TDataSource.Create( Application );
 with SQLDataSource do
  begin
   Parent := MainForm;
  end;

Grid := TDBGrid.Create( Application );
 with Grid do
  begin
   Parent := MainPanel;
    .............
  end;

SQLDataSet.DataSource := SQLDataSource;
SQLDataSet.CommandText := 'SELECT * FROM `service_categories`  LIMIT 0 , 30';
SQLDataSet.Open;// Access Violation

SQLDataSource.DataSet := SQLQuery;
Grid.DataSource := SQLDataSource;

Если в SQLDataSet.CommandText записать Inert ..., то запрос выполняется... Подрузомеваю, что выполняется и SELECT.
Но, на SQLDataSet.Open; выскакиват AccessViolation и дальше я так понимаю процедура не продолжается..
Посему вопросы:
1. Какие мои действия приводят к AccessViolation, или наоборот, чего не хватает.
2. Достаточно ли этих строк для отображения результата выполнения SELECT запроса в таблице..

Автор: <Spawn> 15.11.2004, 05:32
В кмком модуле у тебя находятся компоненты доступа к БД? В каком участке кода пояляется AccessVioletion? Не в OnCreate главного модуля?

А как это могло скомпилиться :

Код

'SELECT * FROM `service_categories`  LIMIT 0 , 30';


Тебе нужно тут продублировать одинарные ковычки:

Код

'SELECT * FROM ''service_categories''  LIMIT 0 , 30';

Автор: Mal Hack 15.11.2004, 12:25
Цитата
В кмком модуле у тебя находятся компоненты доступа к БД? В каком участке кода пояляется AccessVioletion? Не в OnCreate главного модуля?

Все объекты создаются в главном модуле. При OnActivate.
AccessViolation появляется именно на Open у SQLDataSet.
Цитата
Тебе нужно тут продублировать одинарные ковычки:

Там не ковычки, а ` (буква Ё, где ). Синтаксис MySQL такую запись спокойно пропускает.
Да и Делфи не ругается...

Если что, сюда скинул исходники (152 кила) http://mal-hack.net/delphi.rar

Автор: Mal Hack 18.11.2004, 13:24
Решение нашел...
1. Без использования dbExpress, а с использованием специальных классов TMySQLClien & TMySQLResult.
2. Все эти файлы ( файл приаттачит Secandr (90 кил)) надо положить либо в папку с проектом, либо в <Delphi_dir>/lib.
3. Код:
Сразу говорю, показал только основные моменты. Код, для определения ошибок и т.п. писать не стал.
Код

uses
  .....
 uMysqlClient, uMysqlCT, uMysqlErrors, uMysqlHelpers, uMysqlNet, uMysqlNewPassword, uMysqlSSL, uMysqlVio;

type
 ...
   procedure QueryData( Query : string); // Результирующий запрос (заносим данные в таблицу)
   procedure QueryNoData( Query : string ); // insetrt, delete - нет полученны данных
 ...

var
  ...
 SQLConnection     : TMysqlClient; // Объявляем переменную для соединения.
 Grid              : TStringGrid;
  ...

implementation
....

// Установка соединения
SQLConnection := TMysqlClient.Create;
 with SQLConnection do
  begin
   Host      := 'localhost';
   User      := 'root';
   Password  := '';
   Db        := 'mysql';

  try
   connect;
  Except On Exception Do
   begin
     Application.MessageBox( 'К сожалению, соединиться с MySQL-сервером не удалось. Проверьте правильность ввода всех параметров.' , 'Ошибка соединения' , 0 );
    exit;
   end;
  end;
 end;

// Выполнение запроса:

procedure TMainForm.QueryData( Query : string );
var
mysql_result : TMySQLResult;
i , j : integer;
OK : boolean;
begin
OK := true;

try
 mysql_result := SQLConnection.query( Query , true , OK );
Except On Exception Do
 begin
  Application.MessageBox( 'Запрос не выполнилс.' , 'Ошибка соединения' , 0 );
  exit;
 end;
end;

with Grid do
 begin
  ColCount := mysql_result.FieldsCount;
  RowCount := mysql_result.RowsCount+1;

  if RowCount = 1 then
   FixedRows := 0
  else
   FixedRows := 1;

  for i := 0 to mysql_result.RowsCount - 1 do
   for j := 0 to mysql_result.FieldsCount do
    begin
     Cells[ j , i + 1 ] := mysql_result.FieldValue( j );
     mysql_result.Next;
    end;
 end;

mysql_result.free;
end;

procedure TMainForm.QueryNoData( Query : string );
begin
// Аналогично предыдущей процедуре, без внесения данных в таблицу. для запросов Insert, Update .....
end;



Автор: Secandr 18.11.2004, 13:39
zlib

Автор: Secandr 18.11.2004, 13:40
mysql

Автор: Mal Hack 31.1.2005, 18:52
Сорри, забыл отписаться о логической ошибочке.
В цикле занесеня данны в GRID вместо:
Код

 for i := 0 to mysql_result.RowsCount - 1 do
  for j := 0 to mysql_result.FieldsCount do
   begin
    Cells[ j , i + 1 ] := mysql_result.FieldValue( j );
    mysql_result.Next;
   end;

Надо
Код

 for i := 0 to mysql_result.RowsCount - 1 do
  begin
   for j := 0 to mysql_result.FieldsCount do
    Cells[ j , i + 1 ] := mysql_result.FieldValue( j );

    mysql_result.Next;
   end;

Т.е. переход на новую запись должен осуществляться после того, как пройдет цикл по полям текущей записи.

Автор: Cetus 12.3.2005, 00:40
Все должно работать без кавычек, по крайней мере с MySQL 4.0.2

Mal Hack, ты пробовал блокировать таблицы в своем проекте с DbExpress? (lock table tableOne write; unlock tables)

Автор: Mal Hack 12.3.2005, 00:46
Цитата(Cetus @ 12.3.2005, 00:40)
Все должно работать без кавычек, по крайней мере с MySQL 4.0.2

Какие ковычки? smile

Цитата(Cetus @ 12.3.2005, 00:40)
Mal Hack, ты пробовал блокировать таблицы в своем проекте с DbExpress? (lock table tableOne write; unlock tables)

Через dbExpress у меня запросы не выполнялись. Через класс TMySQLClient не пробовал.

Автор: Cetus 12.3.2005, 01:09
про кавычки в другой теме где то вычитал... smile
TMySQLClient из MySQL.rar который выложил Secandr?

Автор: Mal Hack 12.3.2005, 11:18
Цитата(Cetus @ 12.3.2005, 01:09)
TMySQLClient из MySQL.rar который выложил Secandr?

Ага.

Автор: Bars_rb 19.3.2007, 16:47
Хм.
Столкнулся с той же проблемой.
Стоит MySQL 5 версии.
Требует libmysql.dll.
Понапихал ее всюду, но тут сказали, что надо от третей версии.
Вопрос. Где ее взять? Не качать же ради нее весь серв. И пудет ли пахать файл от третей версии с 5 МуСКЛ-ом???

Автор: Rodman 19.3.2007, 17:08
Bars_rb, 
Цитата(Bars_rb @  19.3.2007,  15:47 Найти цитируемый пост)
libmysql.dll.

в инете свободно лежит...

Автор: Bars_rb 19.3.2007, 18:22
Хм. 
Шото я найти не могу...
Мож кто поделиться либо линком, либо файлом.

Автор: B2_Russia 18.5.2007, 21:13
Народ я может темень полная, но что за zlib? Это для чего еще? Это куда? =)

Вышел на эту тему ползая по форуму в поисках принципах работы с mySQL.
Пишу программу которая будет работать в 2 вариантах - PHP и Delphi
Как Mal тоже работал раньше с мусклом только из PHP...

Автор: B2_Russia 26.9.2007, 22:50
Прошло много времени...

Все уже успел успешно применить...

Написал CMS-ку на PHP, сделал клиента с использованием zlib и MySQL.zip выложенных в этом треде.
Но как только поставил CMS на хостинг, возникла проблема несовместимости версии клиента. Там требуется MySQL-клиента 4.1.18.
И все встало! Прога работает только с локальной БД всвязи с чем является бесполезной :((((((((((((((((((((((((

Как решить проблему?

Автор: B2_Russia 27.9.2007, 02:07
Вобщем что только не перепробовал, всеми способами одна ошибка!
Понятно что не нравится версия клиента пишет что не поддерживается протокол, я уже и 5.0 ставил и 4.1.22 MySQL!

NEED HELP!!!

Автор: Rodman 27.9.2007, 14:44
B2_Russia, http://forum.vingrad.ru/index.php?show_type=forum&showtopic=161981\?!

Автор: B2_Russia 27.9.2007, 17:05
Да читал, сейчас прочитал повнимательней, и вроде все прошло удачно с подключением и выбором БД.
Щас попозже попробую выборку сделать.
Всем кто встретился с этой проблемой, идите по выше приведенной ссылке.
Если возникнут траблы отпишу!
Rodman, thx!

Автор: malice_ 28.9.2007, 06:42
какая у тебя версия delphi и mysql?

Автор: B2_Russia 29.9.2007, 19:25
Delphi 7, mysql 4.1.22 
До этого стоял mysql предыдущей версии .
Сейчас все ок.

Автор: malice_ 1.10.2007, 09:31
у меня ничего не получилось с 5.0.0.

куда копировал либ и pas? брал его изhttp://forum.vingrad.ru/forum/topic-161981/anchor-092%3B.html?

Автор: Rodman 1.10.2007, 09:36
Цитата(malice_ @  1.10.2007,  09:31 Найти цитируемый пост)

куда вы копировали либ и pas

а через uses не получается подключить (кинуть канешь рядом с проектом)??? 
Цитата(malice_ @  1.10.2007,  09:31 Найти цитируемый пост)
у меня ничего не получилось с 5.0.0.

подробнее... по этому пояснению могу посоветовать поставить версию 4.ххх

Автор: B2_Russia 1.10.2007, 09:44
У меня версия 4, все работает, но судя по прилично изменившимся размерам libmysql.dll можно предположить что, там много чего поменялось в 5 версии, не исключено, что опять какой-нибудь алгоритм аутентификации, как было при переходе на 4 версию. 
Кстати, этот файл mysql.pas не разработчиками предоставляется случайно?
Тогда имеет смысл посмотреть при установке отметить галочку, чтобы были установлены тулзы для девелоперов, не помню как называется опция... Возможно найдешь в нем, что тебе нужно.

Автор: B2_Russia 1.10.2007, 10:07
Rodman, покажи пожалуйста пример если есть, как сделать выборку используя фукции mysql.pas?

Идея моя в том, чтобы сделать нечто похожее на набор классов TMySQLClient, TMySQLResult так как программа у меня уже написана под них, я сейчас слепил скелет этих классов, все что в примерах написано в закрепленном треде работает, но там нет ни одного примера выборки, как работать с результатом?

Например:
Код

function TMySQLClient.Query(q:string; b:boolean; bRes:boolean):TMySQLResult;
var
 mysql_result : integer;
 MySQLResult : TMySQLResult;
 MYSQL_RES : PMYSQL_RES;
begin
 result := nil;
 mysql_result := mysql_query(MySQL, PChar(q));
 // Где теперь PMYSQL_RES .... ??? 
 MySQLResult := TMySQLResult.Create(MYSQL_RES);
end;


В TMySQLResult мне нужно передать набор полученных данных, чтобы с ними работать используя функции типа First, Next, RecNo, GetFieldByName...
Которые я сам должен реализовать.
Проблема в получении данных, не могу понять как их забрать, как получить структуру MYSQL_RES?

Автор: fidres 1.10.2007, 15:21
это вам на затравку. ;)
http://forum.vingrad.ru/forum/topic-134547/unread-1/anchor-entry1272485/0.html

по части результатов и их обработки - это всё, по идее, нужно в цикле вытаскивать... там же, скорей всего, возвращается некая структура данных! а значит несколько полей обрабатывается...
значит их нужно раскладывать по полочкам...
сам ещё этой хренью не занимался в плотную, другой рутиой занят... обработка и коррекция данных при вводе оных в поля ввода и формирования на основе этих данных корректных запросов.
smile
с работы уволился, но прогу не бросаю. потом продамкому-нить!
;)

Автор: fidres 1.10.2007, 16:00
кстати.
может завести отдельно топ по мускулю, а, Rodman? с крыжиком "важно", чтоб он никуда вниз не уползал...
и будем туда пихать свои наработки. кто чем богат... примеры, приёмы... (а если завести отдельную группу - то можно будет только девелоперам писать, а те, кто спросить чего захочет - чтоб в другую тему писали - права на группу забацать)
у меня пока только наработки по компонентам есть, в которые инфа вводится, чтоб потом в базу закидывать...
но думаю тож немаловажно.
могу поделица.
в основном не использую специализированные компоненты типа DB... SQL...
обрабатываю и вывожу в StringGrid'ы, ComboBox'ы... ну и обычные Edit'ы...
есть ещё CheckListBox...

Автор: Deepthroat 21.10.2007, 17:57
Как я уже писал в другой теме, выход из ситуации для MySQL 5 и dbExpress есть.

Во-первых, надо использовать libmySQL.dll от той версии сервера, к которой намерены подключаться.
Во-вторых, надо использовать библиотеки отсюда http://www.crlab.com/dbx вместо предлагаемых dbExpress по умолчанию. Эти dll'ки работают с MySQL 5 без проблем.

Автор: black_priest 26.10.2007, 10:09
Но эти либы на http://www.crlab.com/dbx платные. А есть ли бесплатное решение? Или нужно подождать пока сам борланд не возьмется за поддержку mysql 5?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)