Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2008, 17:40   #1
jziiiiiii
Пользователь
 
Регистрация: 11.02.2008
Сообщений: 17
По умолчанию libMySQL

Скачал на одном из сайтов libMySQL.dll американсого автора Bob Silva. Скопировал в system32. Подскажите как теперь с помощью Delphi подключиться к MySQL?
jziiiiiii вне форума Ответить с цитированием
Старый 21.02.2008, 18:25   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

1. Получить список экспортов из libMySQL.dll (например вот этим)
2. В соответствии с этой документацией определить эти функции для Дельфи, например
Код:
function mysql_num_rows(result : PMYSQL_RES) : my_ulonglong : external ‘libmySQL.dll' index 80;
не забыв, естественно, про типы.
3. разместить всё это в отдельном юните.
4. Пользоваться как обычными функциями.
Само собой, стоит списать libMySQL.dll с сайта производителя, а вообще она идет в составе серверов mySQL.
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 08:44   #3
jziiiiiii
Пользователь
 
Регистрация: 11.02.2008
Сообщений: 17
По умолчанию

И что ненужно никаких драйверов и конекторов?
jziiiiiii вне форума Ответить с цитированием
Старый 22.02.2008, 09:40   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от jziiiiiii Посмотреть сообщение
И что ненужно никаких драйверов и конекторов?
Не-а.
Если у Вас установлен сервер mySQL (если нет, то, само собой, стоит поставить), то у него в каталоге лежат два подкаталога: include и lib. Это, собственно, и есть mySQL C API. На С можно было бы просто указать заголовок mysql.h, прицепить lib-овские библиотеки и писать, а для паскаля придется перевести заголовки и, вероятно, кое-что написать от руки. Скажем mysql_connect, как таковая, в libmySQL.dll отсутствует, вместо нее есть mysql_real_connect, а mysql_connect - это просто заглушка, вызывающая mysql_real_connect. Честно говоря, не знаю, может быть кто-нибудь для Delphi уже проделал такую работу, у меня скажем, нашлась довольно старая библиотечка, которая в свое время прекрасно работала.
Вложения
Тип файла: rar mydb.rar (138.6 Кб, 71 просмотров)
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 11:52   #5
jziiiiiii
Пользователь
 
Регистрация: 11.02.2008
Сообщений: 17
По умолчанию

Уважаемый B_N.
Вот алгоритм поправьте если не так.
Беру mydb.dcu из вашего архива копирую в C:\Program Files\Borland\Delphi6\Lib, подключаю этот модуль в USES, в тексте вызываю процедуры,

и они должны работать?
---------------------------------
P.S. Надо ли куда-то копировать libMySQL.dll из вашего архива?
jziiiiiii вне форума Ответить с цитированием
Старый 22.02.2008, 12:36   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от jziiiiiii Посмотреть сообщение
Беру mydb.dcu из вашего архива копирую в C:\Program Files\Borland\Delphi6\Lib, подключаю этот модуль в USES, в тексте вызываю процедуры,

и они должны работать?
---------------------------------
P.S. Надо ли куда-то копировать libMySQL.dll из вашего архива?
Да, собственно, даже ничего копировать никуда не нужно, кладите вместе с проектом и всё. libMySQL.dll я запаковал потому, что с ней точно работала эта библиотечка. Версия у неё древняя, сами видите, так что вряд ли стоит ее куда-то копировать. Я этот архив выложил скорее для примера, как из libMySQL.dll функции выдергиваются, кажется даже, она в паре мест кривовато работала, так что лучше переделать всё как положено. Если это поможет, могу привести кусочек работавшей тогда по этому принципу программки:

Код:
unit DBmngmnt;

interface

uses SysUtils, Results, classes,server,myDB, contnrs;
..............
..............
..............

implementation
uses constants, commonfunctions, forms, _ServerControlForm;
..............
..............
..............



function DB_AddAccount(new_acct : TTextAccount):integer;
var
        _addacct : TmyDB;
        _query : string;
begin
        result := result_failure;        { TODO :  }
        if DB_GetAccount(new_acct.AccountID).AccountID = new_acct.AccountID then begin
                result := result_AccountAlreadyExists;
                Exit;
        end;

        _addacct := TMyDB.Create(nil);
        _addacct.Connect (CurrentSystemSettings.mySQL_ADDRESS, CurrentSystemSettings.mySQL_USERNAME, CurrentSystemSettings.mySQL_PASSWORD);
        if _addacct.Active then begin
                _addacct.SelectDatabase(CurrentSystemSettings.mySQL_DBNAME);
                _query :=format('INSERT INTO ACCOUNTS VALUES("","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")',
                [
                //1 RECORDID BIGINT UNIQUE AUTO_INCREMENT NOT NULL,
                        new_acct.AccountID,     //2 ACCOUNTID INT UNSIGNED UNIQUE NOT NULL,
                        new_acct.CallSign1,     //3 CALLSIGN1 CHAR(16),
                        new_acct.CallSign2,     //4 CALLSIGN2 CHAR(16),
                        new_acct.PhoneNumber,   //5 PHONENUMBER CHAR(16),
                        new_acct.PhoneType,     //6 PHONETYPE SMALLINT UNSIGNED,
                        new_acct.GroupMask,     //7 GROUPMASK INT UNSIGNED,
                        new_acct.Status,        //8 ACTIVE TINYINT,
                        new_acct.Sum,           //9 SUM DECIMAL(10,2),
                        new_acct.RatePlan,      //10 RATEPLAN SMALLINT,
                        new_acct.MsgLeft,       //11 MSGLEFT INT UNSIGNED,
                        new_acct.AgreementDate, //12 AGREEMENTDATE DATE,
                        new_acct.AgreementNumber,//13 AGREEMENTNUMBER CHAR(32),
                        new_acct.PropState,     //14 PROPSTATE TINYINT,
                        new_acct.Name,          //15 NAME CHAR(64),
                        new_acct.Address,       //16 ADDRESS CHAR(64),
                        new_acct.Passport,      //17 PASSPORT CHAR(128),
                        new_acct.BankAccount,   //18 BANKACCOUNT CHAR(32),
                        new_acct.BankName,      //19 BANKNAME CHAR(64),
                        new_acct.INN,           //20 INN CHAR(12),
                        new_acct.CBankAccount,  //21 CBANKACCOUNT CHAR(32),
                        new_acct.BIK,           //22 BIK CHAR(20),
                        new_acct.OKPO,          //23 OKPO CHAR(20),
                        new_acct.OKONH,         //24 OKONH CHAR(20),
                        new_acct.ContactPhone,  //25 CONTACTPHONE CHAR(20),
                        new_acct.ContactEmail,  //26 CONTACTEMAIL CHAR(48),
                        new_acct.AccountPassword,//27 ACCOUNTPASSWORDHASH CHAR(32)
                        new_acct.AccountBinaryPassword, //28 ACCOUNTBINARYPASSWORD DECIMAL(16)
                        '0',//new_acct.DeletionDate,
                        new_acct.Provider,
                        new_acct.Reserved1,
                        new_acct.Reserved2,
                        new_acct.Reserved3,
                        new_acct.Reserved4
                ]);
                _addacct.query(_query);
                case _addacct.Error of
                        0: result := result_accountadded
                        else result := result_DBERROR;
                end;

        end;
        _addacct.Active:=False;
        _addacct.free

end;
..............
..............
..............
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 12:38   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:
function DB_GetUsers(var users : TUsersArray; gu: TGetUsers): integer;
var
        _getusers       : TmyDB;
        _query          : string;
        s               : string;
        i               : integer;
begin

        s := '';
        _Query := 'SELECT * FROM USERS';
        if gu.GetOperators then begin
                s := s + ' USERPRIVILEGES ="' + textUSER_OPERATOR + '" ';
        end;

        if gu.GetPowerOperators then begin
                if s <> '' then s := s + ' OR ';
                s := s + ' USERPRIVILEGES ="' + textUSER_POWEROPERATOR + '" ';
        end;

        if gu.GetAdmins then begin
                if s <> '' then s := s + ' OR ';
                s := s + ' USERPRIVILEGES ="' + textUSER_ADMIN + '" ';
        end;

        if s > '' then _Query := _Query + ' WHERE ' + s + 'ORDER BY USERNAME';
        _getusers := TMyDB.Create(nil);
        _getusers.Connect (CurrentSystemSettings.mySQL_ADDRESS, CurrentSystemSettings.mySQL_USERNAME, CurrentSystemSettings.mySQL_PASSWORD);
        if _getusers.Error <> 0 then begin
                result := result_DBERROR;
                exit;
        end;
        if _getusers.Active then begin
                _getusers.SelectDatabase(CurrentSystemSettings.mySQL_DBNAME);
                if _getusers.Error <> 0 then begin
                        result := result_DBERROR;
                        exit;
                end;
                _getusers.query(_query);
                if _getusers.Error <> 0 then begin
                        result := result_DBERROR;
                        exit;
                end;
                if _getusers.hasresult and (length(_getusers.resultset) > 0) then begin
                        for i := 0 to length(_getusers.resultset)-1 do begin
                                SetLength(users, (Length(users) + 1));

                                users[i].UserID         := _getusers.Resultset[i][0];
                                users[i].UserEnabled    := _getusers.Resultset[i][1];
                                users[i].UserName       := _getusers.Resultset[i][2];
                                users[i].UserPassword   := _getusers.Resultset[i][3];
                                users[i].UserPrivileges := _getusers.Resultset[i][4];
                                users[i].UserFullName   := _getusers.Resultset[i][5];
                                users[i].UserPrefs      := _getusers.Resultset[i][6];
                        end;
                        result := result_SUCCESS;
                end
                else
                        result := result_NoData;
        end
        else begin
                result := result_DBError;
        end;
        _getusers.Active:=False;
        _getusers.free
end;
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 14:30   #8
jziiiiiii
Пользователь
 
Регистрация: 11.02.2008
Сообщений: 17
По умолчанию

Скажите, а можно подключиться к MySQL серверу установленному на другом компьютере в локальной сети. Т. е. требуется чтобы на клиентской машине не было не MySQL сервера, не MySQL клиента, не BDE драйвера, максимум можно установить libmysql.dll? Можно так или нет?
jziiiiiii вне форума Ответить с цитированием
Старый 22.02.2008, 14:34   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Можно. Хоть на другом континенте. Всё что нужно - libmysql.dll и Win32. Но, правда, данные все надо самому обрабатывать, все DB-шные компоненты тут вряд ли помогут.
B_N вне форума Ответить с цитированием
Старый 10.08.2008, 10:55   #10
Банзай
Пользователь
 
Аватар для Банзай
 
Регистрация: 21.08.2007
Сообщений: 89
По умолчанию

подскажите как через libmysql получить список всех доступных баз на сервере?
подписываюсь
Банзай вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц