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



Вопросы
  Программно скрыть MainMenu
   Категория: Компоненты
  Получить список запущенных приложений
   Категория: Приложение
  Узнать все IP-адреса компьютера
   Категория: Интернет и Сети
  Перекодировка текста DOS-Windows-Koi8
   Категория: Текст и строки
  Сохранение странички в файл из TWebBrowser
   Категория: Интернет и Сети
  Подсчитать количество слов в строке
   Категория: Текст и строки
  Компоненты Panel, GroupBox, Bevel, ScrollBox, Splitter
   Категория: Компоненты

Публикации: Мои статьи

MySQL на локальном компьютере

Дата: 29.10.2011 | Комментариев: 0 | Просмотров: 7091
Программисты, работающие с базами данных, хорошо знают возможности MySQL-сервера. А возможности эти почти безграничны. На MySQL работает 90% сайтов в интернете. Связка PHP + MySQL не имеет равных по популярности. Поддержка хранимых процедур, триггеров, движки InnoDB и MyISAM и многое-многое другое... На крупных предприятиях работают серверы MySQL с огромными объемами данных.

При написании небольших программ разработчики обычно игнорируют MySQL из-за необходимости установки сервера, разграничения прав пользователей и т.п. Но самое главное, из-за невозможности переноса программы на другой компьютер на котором не установлен MySQL. Говорят, что использование MySQL в маленьких проектах - стрельба из пушки по воробьям.

Но бывают программы, которым не нужен сервер. В программе работает локально один человек, но использует очень большие объемы данных. "Заменители" BDE типа Absolute DB, Accuraser, Turbo DB, EasyTable и прочие для таких целей слишком слабы. Они не расчитаны для больших объемов данных. SQLite имеет мало типов полей и слишком ограниченные возможности. Для подобных целей хорошо подходит Firebird Embedded server. Но если про настройку Firebird Embedded написана куча статей, то про MySQL Embedded информации нет вообще, не считая нескольких строк в справке компонентов MyDAC.
Можно ли написать программу с использованием MySQL, которая будет запускаться с флешки на ЛЮБОМ компьютере?

Что понадобится

1. Непосредственно IDE (я использую Delphi 2010)

2. Установленные в IDE компоненты Data Access Components for MySQL Developer Edition (MyDAC). Скачать их можно у нас.

3. Файл libmysqld.dll. Это и будет наш сервер. Скачать его можно у нас.

4. Из папки ранее установленного сервера MySQL следующие папки:
\share\charsets\ с файлами кодировок. Кодировки хранятся в файлах *.xml. Ненужные можно удалить для уменьшения веса.
\share\english\ с файлом errmsg.sys для сообщений об ошибках.
\data\mysql\ - это база данных mysql, в которой содержатся данные сервера, пользователи, зоны времени, хранимые процедуры, справка и т.д. Кроме того в папке \data\ будут храниться все базы данных.

Где взять эти папки? Из любого установленного ранее MySQL-сервера. Например, из установленного Денвера. Свою базу mysql я не могу выложить на сайт, т.к. производил в ней много изменений в настройках.

Внимание! На сайте Devart написано, что официально MySQL Embedded не поддерживается для MySQL версии 5.0. Они рекомендуют использовать версии 4.1, 5.1 и другие. Может быть сейчас что-то изменилось и с версией 5.0 все будет работать как положено, но я не знаю, не проверял.


Создание приложения

1. Запустите Delphi, создайте новый проект и сохраните его, например, в папке D:\Test.

2. Положите файл libmysqld.dll в папку с проектом (туда где будет exe-файл)

3. В папке проекта создайте папку data (D:\Test\data\) и скопируйте в нее папку mysql вместе с содержимым (D:\Test\data\mysql\)

4. В папке проекта создайте папку share и скопируйте в нее две папки charsets (D:\Test\share\charsets\) и english (D:\Test\share\english\) вместе с содержимым.

5. На форму проекта положите компоненты MyEmbConnection, MyQuery, DBGrid, DataSource и Button

MySQL на локальном компьютере

(рис. 1).


Для наглядности я здесь не изменял имена компонентов, но вы никогда так не делайте. Давайте компонентам осмысленные имена.

6. В свойствах компонентов свяжите их

DBGrid1.DataSource => DataSource1;
DataSource1.DataSet => MyQuery1;
MyQuery1.Connection => MyEmbConnection1;


7. Создайте текстовый файл с таким текстом

CREATE DATABASE DB_TEST;

CREATE TABLE DB_TEST.TEST_TABLE (
В В `ID` int(11) NOT NULL AUTO_INCREMENT,
В В `NAME` varchar(50) DEFAULT NULL,
В В PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;

INSERT INTO DB_TEST.TEST_TABLE VALUES
В В (1, 'Запись 1'),
В В (2, 'Запись 2'),
В В (3, 'Запись 3'),
В В (4, 'Запись 4'),
В В (5, 'Запись 5');


8. Сохраните этот файл в папке проекта с именем abc.sql.

9. Установите следующие свойства компонента MyEmbConnection

LoginPromt = > False
BaseDir = > '.'
DataDir = > 'data'
Option-Charset = > 'cp1251'


10. Так как вы будете работать только с высокоскоростными таблицами MyISAM, таблицы InnoDB вам не понадобятся. Кликните два раза по компоненту MyEmbConnection и установите галочку в пункте Disable the InnoDB storage engine.

MySQL на локальном компьютере

Рис. 2


Строка подключения должна выглядеть примерно так:

--basedir=.
--datadir=data
--skip-innodb


Увидеть ее можно кликнув по кнопке Advanced на закладке Params (Рис. 2).

11. Проверьте возможность соединения с сервером, установив свойство компонента
 MyEmbConnection1.Connected = > True;

Если соединение установилось - все ОК. Верните свойство Connected в False, т.к. в скомпилированном приложении сервер не разрешит соединиться второй раз.

Для события onclick кнопки Button1 напишите следующий код:

procedure TfrmMain.Button1Click(Sender: TObject);
begin
В В with MyQuery1 do
В В begin
В В В В Close;
В В В В SQL.LoadFromFile('abc.sql');
В В В В ExecSQL;

В В В В Close;
В В В В SQL.Text := 'SELECT * FROM DB_TEST.TEST_TABLE';
В В В В Open;
В В end;
end;


Если все сделали правильно, в папке \data\ создалась папка базы данных \DB_TEST\ с файлами таблиц. Закройте скомпилированное приложение и установите свойство компонента
MyQuery1.DataBase = > 'DB_TEST';

Это сделано для того, чтобы в sql-запросах в дальнейшем обращаться непосредственно к таблице без указания базы данных.
(select * from Table вместо select * from Database.Table).

MySQL на локальном компьютере

Рис. 3


Стоила ли овчинка выделки?

Давайте проверим для чего все это делалось.

Измените код кнопки Button1 на такой

procedure TfrmMain.Button1Click(Sender: TObject);
var
В В i: Integer;
begin
В В with MyQuery1 do
В В begin
В В В В Close;
В В В В SQL.Text := 'SELECT * FROM DB_TEST.TEST_TABLE';
В В В В Open;
В В В В DisableControls;
В В В В for i := 0 to 50000 do
В В В В begin
В В В В В В Insert;
В В В В В В FieldByName('name').AsString := 'Запись ' + inttostr(i);
В В В В В В Post;
В В В В end;
В В В В EnableControls;
В В end;
В В ShowMessage('Готово');
end;


Скомпилируйте приложение и выполните код. У меня добавление 50 000 записей заняло около 4-х секунд. Согласитесь, что для локальной БД это более чем хорошо.

Итак, вся мощь МySQL у вас в одной папке. Пишите, дерзайте...
Удачи.

Скачать исходник

Delphi_Coder
Октябрь, 2011

При перепечатке любых статей ссылка на сайт delphi-z.ru обязательна.
Все используемые на сайте статьи, файлы и логотипы компаний принадлежат их законным владельцам. Если вы являетесь правообладателем "MySQL на локальном компьютере" и не желаете, чтобы ваша информация находилась на нашем сайте, напишите нам и эта информация будет удалена.

Теги: мои статьи, mysql, SQL

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
  • va
  • Дата: 10 февраля 2012 21:17
  • 0 комментариев
  • 0 публикаций
А вот и не работает. Пока не запустишь denwer например ... А на чистой машине пробовали ? а не нужен ли программе запущенный mysql сервер ?
  • Filin
  • Дата: 11 февраля 2012 12:46
  • 79 комментариев
  • 891 публикация
А вот и работает.
Специально не поленился и проверил на компьютере сына (на котором кроме игр никогда ничего небыло) и даже на ноутбуке жены. Все работает. Вот исходничек. Кстати, только что сделал его без запуска каких-либо серверов.
  • va
  • Дата: 12 февраля 2012 18:28
  • 0 комментариев
  • 0 публикаций
Да действительно работает. Проблема была в файле libmysqld.dll, который у меня почему то весил всего 1мб, в отличие от вашего в 3 мб. Проверил с UniDac.
Еще пару вопросов: Нужна ли папка \data\mysql\*.* ? На первый взгляд работает и без нее. И можно ли распространять libmysqld.dll с коммерческим продуктом, ведь сервер у них платный. Спасибо большое за статью и быстрый отзыв.
  • Filin
  • Дата: 14 февраля 2012 00:03
  • 79 комментариев
  • 891 публикация
Нужна ли папка \data\mysql\*.* ? На первый взгляд работает и без нее.


По идее должна работать. Ведь на локалке вряд ли кто-нибудь будет использовать хранимые процедуры и т.п. Но там еще хранятся форматы, time_zone и прочая чепуха. Разработчики MyDac говорят, что нужна...

можно ли распространять libmysqld.dll с коммерческим продуктом


Я в этом вопросе не специалист, но на сайте MySQL написано черным по белому

MySQL open source software is provided under the GPL License.

И далее по справочнику:

GPL - Общедоступная Лицензия GNU (the GNU General Public License). GPL была разработана для проекта GNU ассоциацией Free Software Foundataion. Суть этой лицензии состоит в том, что исходные тексты программ доступны для пользователя. ..........
Разрешается распространять продукт как бесплатно, так и за деньги, которыми оплачиваются услуги по копированию ...и т.д......................


Но лучше проконсультироваться у специалистов. А то MegaUpload тоже думал, что не нарушает законодательство... what
  • 0 комментариев
  • 0 публикаций
Поправьте пожалуста ссылки на:
2. Установленные в IDE компоненты Data Access Components for MySQL Developer Edition (MyDAC). Скачать их можно у нас.
3. Файл libmysqld.dll. Это и будет наш сервер. Скачать его можно у нас.
  • Filin
  • Дата: 23 мая 2012 20:37
  • 79 комментариев
  • 891 публикация
Поправьте пожалуста ссылки на:

Спасибо. Исправил.
  • 0 комментариев
  • 0 публикаций
Замечательная статья! Очень актуальна!
Но возникла небольшая загвоздка. С Вашим "родным" libmysqld.dll никаких поблем, а вот ежели все взять из MYSQL 5.6.11 беда: A call to an mysql_server_init failed! c:\Users\Admin\AppData\Roaming\MySQL\.mylogin.cnf - не удается найти указанный файл!

Ну не дружит MYDAC 7.1.6 c MYSQL 5.6.11
Может есть выход, очень уж последнюю версию мускула хочется!
  • Dimon
  • Дата: 9 сентября 2013 15:14
  • 0 комментариев
  • 0 публикаций
Для использования MyDAC с MYSQL Embedded 5.6.11 установите переменную MySQLEmbDisableEventLog в True.
MySQLApi.MySQLEmbDisableEventLog := True;
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.