Нужен Пример По Работе Онлайн С Mysql Базами Данных

21.01.2013
7
0
38
Барнаул
#1
Доброго времени суток уважаемые пользователи форума.
Нужен исходник, пример с коментами на рус. языке по онлайн работе c базами данных mysql в Delphi 7 с использованием стандартных или бесплатных компонентов под OC Windows XP.
Погуглил примеров исходников маловато нашлось.
Если у кого есть киньте в лс, за ранее спасибо.
С уважением
 

sinkopa

Well-Known Member
#2
Доброго времени суток уважаемые пользователи форума.
Нужен исходник, пример с коментами на рус. языке по онлайн работе c базами данных mysql в Delphi 7 с использованием стандартных или бесплатных компонентов под OC Windows XP.
Погуглил примеров исходников маловато нашлось.
Если у кого есть киньте в лс, за ранее спасибо.
С уважением
Хм... примеров то "накидать" не сложно... Вот только будут ли они (мои примеры) у Вас работать? :)
Давайте начнем с того что подготовим "площадку для тестов и экспериментов".
Нам понадобятся:
1. MySQL cервер
2. Инструмент управления сервером MySQL
3. Библиотека Delphi для работы с MySQL
4. Драйвер для MySQL той версии, с которой мы будем работать.

(1) и (2) нам обеспечит Денвер (Джентльменский набор Web-разработчика) http://denwer.ru
(3) и (4) нам обеспечит библиотека ZeosLib http://zeos.firmos.at/portal.php

По порядку.

1. Установка Денвер.
Качаем отсюда http://www.denwer.ru/base.html и устанавливаем.
Вы можете выбрать любой вариант установки, но я рекомендую компакнтый. Для этого:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Порядок действий"</div></div><div class="sp-body"><div class="sp-content">1.1. Берем flash-накопитель (размер не важен, 256 мб вполне хватит)
1.2. Форматируем. Назначаем (при желании) статически букву диска (например "Z").
1.3. Запускаем инсталлятор Денвер. На вопрос "куда устанавливать" указываем корневой каталог flash-накопителя (Z:)
1.4. В опциях установки отказываемся от "Запускать при старте Windows" и "Создать ярлыки в меню Пуск" Такой вариант установки обеспечит переносимость системы между компьютерами (к примеру, если нужно показать работу Вашей программы заказчику.)
После установки Денвера, скорее всего Вам нужно будет "подружить" его с антивирусом. При старте Денвер создает несколько виртуальных хостов, для этого в файл hosts вносятся соответствующие ссылки (при остановке Денвер-а они удаляются).

Запуск Денвер: "Z:\denwer\Run.exe"
Остановка: "Z:\denwer\Stop.exe"

2. Настройка MySQL
2.1. Создадим пользователя и базу данных
2.1.1. Запускаем Денвер.
2.1.2. В адресной строке интернет эксплорера пишем: "http://localhost/denwer/" (или просто http://localhost)
Если все нормально установилось и запустилось, видим страничку приветствия Денвер-а.
2.1.3. В разделе Утилиты выбираем пункт "Заведение новых БД и пользователей MySQL"
2.1.4. Заполняем поля формы:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Форма"</div></div><div class="sp-body"><div class="sp-content"> - "Пароль администратора MySQL:" - оставляем пустым (см. примечание)
- "Имя базы данных:" - пишем "delphi"
- "Логин пользователя:" - пишем "delphi"
- "Пароль:" - пишем "delphi"
- "...еще раз:" - пишем "delphi" 2.1.5. Жмем кнопку "Создать БД и пользователя"

Новая база данных с именем "delphi" и пользователь "delphi" созданы.

2.2. Зададим созданному пользователю привилегии администратора сервера MySQL
2.2.1. Возвращаемся на страницу приветствия и в разделе Утилиты выбираем пункт "phpMyAdmin - администрирование СУБД MySQL"
2.2.2. На открывшейся странице, переходим на закладку "Пользователи" и в таблице "Обзор учетных записей" находим пользователя с именем "delphi".
2.2.3. В строке пользователя, в колонке "Действие" выбираем пункт "Редактирование привилегий"
2.2.4. В секции "Глобальные привилегии" выбираем "Отметить все" и жмем "ОК"
2.2.5. Для применения привилегий жмем сслыку "перезагрузить привилегии" (внизу страницы на закладке "Пользователи").
Теперь пользователь "delphi" имеет глобальные права администратора.
Все. Переходим к пункту (3)[/b]
 

sinkopa

Well-Known Member
#3
3. Установка библиотеки ZeosLib.
Почему я выбрал именно ZeosLib, объяснять не буду... читайте в интернете (например тут http://freevcl.blogspot.ru/2010/08/zeoslib-delphi.html)

3.1. Скачиваем последнюю версию библиотеки отсюда: http://sourceforge.net/projects/zeoslib/
3.2. Распаковываем скачаный архив в каталог установки (к примеру "C:\DELPHILIB\ZeosLib")
3.3. Добавляем в репозиторий Delphi (Для Delphi7 - Tools -> Environtment Options -> Library -> Library path... ) следующие пути к исходникам:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Пути к исходникам ZeosLib"</div></div><div class="sp-body"><div class="sp-content"> - "C:\DELPHILIB\ZeosLib\src\component"
- "C:\DELPHILIB\ZeosLib\src\core"
- "C:\DELPHILIB\ZeosLib\src\dbc"
- "C:\DELPHILIB\ZeosLib\src\parsesql"
- "C:\DELPHILIB\ZeosLib\src\plain"
3.4. Открываем в Delphi установочный файл "ZeosDbo.bpg" (Для Delphi7 File -> Open -> "C:\DELPHILIB\ZeosLib\packages\delphi7\ZeosDbo.bpg")
3.5. В окошке "Project manager", кликаем правой кнопкой мыши на пакете "ZComponentDesign70.bpl" и выбираем пункт "Install"
Библиотека установлена. Закрываем Delphi (без сохранения). Переходим к пункту (4).

4. Установка клиентского коннектора (драйвера) MySQL (что это такое, читайте тут http://dev.mysql.com/downloads/connector/)
Поскольку ZeosLib позволяет работать с большинством популярных SQL серверов, в состав инсталятора клиентские DLL-ки не включены.
Клиента для интересующего вас протокола (в нашем случае "mysql") необходимо скачать самостоятельно, с SVN репозитория проекта ZeosLib.
Для этого Вам понадобится программа - SVN клиент. Если у Вас такой нет, рекомендую "TortoiseSVN"
Инсталлятор для Вашей операционной системы берем тут: http://tortoisesvn.net/downloads.html
На этой же странице (внизу) ссылки для скачивания "Language packs" (40 возможных языков интерфейса)
Скачиваем, устанавливаем, настраиваем.

4.1. Запускаем браузер SVN клиента. В адресной строке пишем: "svn://svn.code.sf.net/p/zeoslib/code-0/tags/"
4.2. В дереве репозитория выбираем путь к каталогу "lib" текущей версии исходников библиотеки.
В данном случае нам нужен "svn://svn.code.sf.net/p/zeoslib/code-0/tags/7.0.3-stable/lib/"
4.3. Кликаем правой кнопкой мыши на каталог "mysql". В появившемся меню выбираем "Export...".
4.4. Указываем целевой каталог для экспорта, жмем "ОК", дожидаемся завершения закачки.
4.5. Скачаные файлы:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Список файлов"</div></div><div class="sp-body"><div class="sp-content"> - "libmysql41.dll"
- "libmySQL50.dll"
- "libmysql51.dll"
- "libmysql55.dll" помещаем в директорию Windows\System32 (или в каталог куда будет компилироваться Ваш Delphi проект).
Установка закончена.
 

sinkopa

Well-Known Member
#4
Проверяем нашу тестовую площадку на "готовность к бою"
1. Стартуем Денвер.
2. Создаем новый Delphi проект.
3. На форму кладем компонент "ZConnection" (на закладке Zeos Access) и кнопку.
4. В обработчите клика пишем код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ZConnection1.Connected then
begin
ZConnection1.Disconnect;
MessageBox(Handle, 'Отключились!',
PChar(Application.Title), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
Exit;
end;

{ Инициализация }
ZConnection1.HostName := 'localhost';
ZConnection1.Port := 3306;
ZConnection1.Protocol := 'mysql';
ZConnection1.User := 'delphi';
ZConnection1.Password := 'delphi';

{ Подключение }
try
ZConnection1.Connect;
MessageBox(Handle, 'Подключение произошло успешно!',
PChar(Application.Title), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
except
MessageBox(Handle, 'Подключение закончилось неудачей!',
PChar(Application.Title), MB_OK + MB_ICONSTOP + MB_TOPMOST);
end;

end;
5. Сохраняем проект, компилируем, запускаем.
Если (по клику на кнопку) Вы получили сообщение "Подключение произошло успешно!" - примите мои поздравления!
Все установлено и настроено правильно, наша "стройплощадка" готова к "бою"! :)

На сегодня пожалуй Всё.
Завтра, если не будет вопросов по установке и настройке, покажу собственно примеры работы c MySQL и ZeosLib
 
21.01.2013
7
0
38
Барнаул
#5
Здравствуйте, благодарю Вас за отклик!
Все прошло как по маслу, все установил.
Без ошибок и с первого раза.
Подключение произошло успешно, площадка готова. :rolleyes:
Вопросов по установке и настройки нет.
В ожидании примеров работы c MySQL и ZeosLib.
С уважением
 
21.01.2013
7
0
38
Барнаул
#6
Проверяем нашу тестовую площадку на "готовность к бою"
1. Стартуем Денвер.
2. Создаем новый Delphi проект.
3. На форму кладем компонент "ZConnection" (на закладке Zeos Access) и кнопку.
4. В обработчите клика пишем код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ZConnection1.Connected then
begin
ZConnection1.Disconnect;
MessageBox(Handle, 'Отключились!',
PChar(Application.Title), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
Exit;
end;

{ Инициализация }
ZConnection1.HostName := 'localhost';
ZConnection1.Port := 3306;
ZConnection1.Protocol := 'mysql';
ZConnection1.User := 'delphi';
ZConnection1.Password := 'delphi';

{ Подключение }
try
ZConnection1.Connect;
MessageBox(Handle, 'Подключение произошло успешно!',
PChar(Application.Title), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
except
MessageBox(Handle, 'Подключение закончилось неудачей!',
PChar(Application.Title), MB_OK + MB_ICONSTOP + MB_TOPMOST);
end;

end;
5. Сохраняем проект, компилируем, запускаем.
Если (по клику на кнопку) Вы получили сообщение "Подключение произошло успешно!" - примите мои поздравления!
Все установлено и настроено правильно, наша "стройплощадка" готова к "бою"! :)

На сегодня пожалуй Всё.
Завтра, если не будет вопросов по установке и настройке, покажу собственно примеры работы c MySQL и ZeosLib
Благодарен за ответы, в ожидании примеров работы c базами данных MySQL и компонентов ZeosLib.
Пожалуйста дайте примеры, работа с данными компонентами практически не описана в интернете.
С уважением
 

sinkopa

Well-Known Member
#7
Пожалуйста дайте примеры, работа с данными компонентами практически не описана в интернете.С уважением
Я вернулся... :)
Прошу сильно не бить, причины отсутствия были уважительные.
К тому же как выяснилось в синтаксисе запросов MySQL 5.x произошли некоторые изменения.
Пришлось немножко "проапгрейдить" мозги... :)
Что и Вам советую: http://dev.mysql.com/doc/refman/5.5/en/index.html

Ну что? Продолжим?

Компоненты ZeosLib

TZConnection
- обслуживает соединение с сервером баз данных и обрабатывает транзакции (так же как это делает в BDE компонент TDatabase);
- дает возможность выполнить SQL запрос напрямую (без участия других компонент);
- содержит несколько дополнительных методов-утилит (облегчающих жизнь программисту).

Примеры
Код:
 { Подключение }
ZConnection1.HostName := 'localhost';
ZConnection1.Port := 3306;
ZConnection1.Protocol := 'mysql';
ZConnection1.User	 := 'delphi';
ZConnection1.Password := 'delphi';
ZConnection1.Connect; {тоже самое что и ZConnection1.Connected := True;}

{ Отключение }
ZConnection1.Disconnect; {тоже самое что и ZConnection1.Connected := False;}

{ Если выставить свойство ZConnection1.LoginPrompt := True;
то назначение свойств User и Password происходит в обработчике события OnLogin
(например через показ формы диалога)
}
procedure TForm1.ZConnection1Login(Sender: TObject; var Username, Password: String);
begin
Username := 'delphi';
Password := 'delphi';
end;

//... 

{ Получить список баз данных на сервере }
ZConnection1.GetCatalogNames(ListBox1.Items);

{ Получить список всех таблиц в базе 'delphi' }
ZConnection1.GetTableNames('delphi','',ListBox2.Items);
{ Получить список всех таблиц в базе 'delphi', содержащих в названии 'table'}
ZConnection1.GetTableNames('delphi','%table%',ListBox2.Items);
{ Получить список всех таблиц в базе 'delphi', названия которых начинаются с 'new'}
ZConnection1.GetTableNames('delphi','new%',ListBox2.Items);

{ Примечание: Если какой либо SQL запрос был однажды выполнен (до ZConnection1.Disconnect)
ZConnection попытается не выполнять его повторно а вернуть из кэша результат (с прошлого раза)
Это ускоряет работу приложения, но не всегда хорошо. Например если вы запросили список таблиц, 
потом создали новую таблицу и следом опять запрашиваете (обновленный) список таблиц (тем же запросом)... 
Чтобы очистить кэш метаданных ZConnection1, необходимо выполнить: 
}
ZConnection1.DbcConnection.GetMetadata.ClearCache;
TZSQLMonitor - позволяет наблюдать (вести лог) за происходящими тразакциями.
Использование
1. Положить на форму. Выставить свойство
Код:
ZSQLMonitor1.Active := True;
Добавить в uses ZDbcLogging;
2. Для наблюдения:
- Положить на форму TMemo;
- В обработчике события OnLogTrace вписать код:
Код:
procedure TForm1.ZSQLMonitor1LogTrace(Sender: TObject; Event: TZLoggingEvent);
begin
Memo1.Lines.Add(Event.AsString);
end;
3. Для автоматического ведения лога в файле - выставить свойства:
Код:
ZSQLMonitor1.FileName := 'C:\Log\MyAppLog.log';
ZSQLMonitor1.AutoSave := True;
TZSQLProcessor - Этот компонент предназначен для обработки SQL-скриптов большого размера, загружемых вызовом методов LoadFromStream() или LoadFromFile().
Отдельные SQL запросы (в тексте загружаемого скрипта) должны быть разделены символом "," (по умолчаниню) либо определеным в свойстве ZSQLProcessor1.Delimiter (когда ZSQLProcessor1.DelimiterType := dtDelimiter;)
Выполняемый SQL-скрипт обрабатывается в явной транзакции (AutoCommit = True). Если все запросы в скрипте выполнились успешно, изменения будут зафиксированы на сервере.
В случае ощибки - будет произведен "откат" к последнему удачно выполненному оператору в скрипте.
Примечание(от меня): Если я правильно понял, обрыв связи с сервером не является критической ошибкой.
В этом случае происходит автоматический реконнект, затем продолжается выполнение скрипта (с момента обрыва связи).
Пример:
Код:
 uses
ZScriptParser;

//... 

ZSQLProcessor1.Delimiter := ';';
ZSQLProcessor1.DelimiterType := dtDelimiter;
ZSQLProcessor1.Script.LoadFromFile('C:\delphiDB.sql');
try
ZSQLProcessor1.Execute;
ShowMessage('Импорт в базу данных "delphi" выполнен!');
except
ShowMessage('Ощибка импорта в базу данных "delphi"!');
end;
 

sinkopa

Well-Known Member
#8
TZTable - являтся полной аналогией компонента TTable находящегося на закладке BDE, за одним исключением:
вместо свойства TTable.DatabaseName необходимо установить:
Код:
ZTable1.Connection := ZConnection1;
Дальше можно использовать справку и примеры относящиеся к компоненту TTable.
Замечание (от авторов ZeosLib):
TZTable рекомендуется использовать, только если у вас очень маленькие таблицы, потому что после открытия TZTable, все записи с сервера (относящиеся к данной таблице) перемещаются в память клиента.

TZStoredProc (Хранимая Процедура) - аналог компонента TStoredProc находящегося на закладке BDE
Результирующий набор хранимой процедуры, может быть обработан так же, как результат SQL запроса выполненного любым другим способом (например TZQuery).
Замечание:
- Если хранимая процедура возвращает результирующий набор данных, то активировать ее следует вызовом метода Open:
Код:
 ZStoredProc1.Close;
ZStoredProc1.ParamByName ('Name').Value := 'ValueForParam_Name';
ZStoredProc1.Open;
- Если хранимая процедура не имеет результирующего набора данных, то ее следует выполнять вызовом метода ExecProc:
Код:
 ZStoredProc1.ParamByName ('Name').Value := 'ValueForParam_Name';
ZConnection1.StartTransaction; 
try
ZStoredProc1.ExecProc;
except
ZConnection1.Rollback;
end;
ZConnection1.Commit;
TZQuery - аналог компонента TQuery находящегося на закладке BDE
(1) TZQuery позволяет выполнять SQL запросы возвращающие (либо не возвращающие) результирующий набор данных.
Замечание:
- Если SQL запрос возвращает данные, то его выполнение следует делать вызовом метода Open либо выставлением свойства (ZQuery1.Active := True;)
Код:
var F: TField;
begin
ZQuery1.SQL.Text:= 'SHOW TABLE STATUS FROM db_Name WHERE `Name` = ''table_Name'';';
ZQuery1.Open;
ZQuery1.First;
F := ZQuery1.FieldByName('Engine');
if (F <> nil) then
ShowMessage('Engine='+F.AsString);

F := ZQuery1.FieldByName('Collation');
if (F <> nil) then 
ShowMessage('DEFAULT CHARSET='+F.AsString);

ZQuery1.Close;
end;
- Если SQL запрос не возвращает данных, его выполняют вызовом метода ExecSQL
Код:
 ZQuery1.SQL.Text:= 'FLUSH PRIVILEGES';
ZQuery1.ExecSQL;
(2) TZQuery позволяет синхронизировать данные (связанные с SQL запросом) в направлениях слиент->сервер и сервер->слиент.
Класическое использование TZQuery (точно также как с BDE TQuery):
На форме
Код:
type
TForm1 = class(TForm)
{ ZeosLib }
ZConnection1: TZConnection;
ZQuery1: TZQuery;
{ Стандартные компоненты Delphi }
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
Использование
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
{ Связи (можно сразу выставить в Дизайнере) }
ZQuery1.Connection := ZConnection1;
DataSource1.DataSet := ZQuery1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;

{ Инициализация }
ZConnection1.HostName := 'localhost';
ZConnection1.Port := 3306;
ZConnection1.Protocol := 'mysql';
ZConnection1.Database := 'delphi';
ZConnection1.User	 := 'delphi';
ZConnection1.Password := 'delphi';

{ Активация }
ZConnection1.Connect;
ZQuery1.SQL.Text := 'SELECT * FROM delphi.cargo';
ZQuery1.Active := True;
end;
Всё! На этом можно и закончить :)
Дальше все работает "страндартно"... т.е. можно использовать любые (совместимые с TDataSource) стандартные компоненты.

TZUpdateSQL компонент очень похожий на TUpdateSQL находящийся на закладке BDE.
Предоставляет доступ для изменения набора метаданных TZQuery.
Связанные вместе TZUpdateSQL и TZQuery (ZQuery1.UpdateObject := ZUpdateSQL1;) позволяют производить "тонкую настройку" запросов. (читайте в справке про TUpdateSQL)
Пример использования TZQuery:
Код:
with ZQuery1 do
begin
SQL.Clear;
{ Задание шаблона запросов с подстановочными переменными ":Val1", ":Val2",
":Val3", ":Val4" (обнаруживаются по наличию преффикса ":")
}
SQL.Add('INSERT INTO table1 VALUES (:Val1, :Val2);');
SQL.Add('INSERT INTO table2 VALUES (:Val3, :Val2);');
SQL.Add('UPDATE table3 SET field1 = :Val4;');

//... 

{ Задание значений переменным через параметры }
Params.ParamByName('Val1').AsInteger := 123;
Params.ParamByName('Val2').AsBoolean := False;
Params.ParamByName('Val3').AsString := 'Vasya Pupkin';
Params.ParamByName('Val4').AsInteger := 321;
{ Выполнение запроса (вместо ":Val1" будет подставлено "123" итд.) }
ExecSql;
end;
TZReadOnlyQuery - Тоже самое что и TZQuery с одним отличием: результирующий набор данных получаемый SQL запросом доступен в режиме "только для чтения". За счет этого работает быстрее чем TZQuery.

TZSQLMetadata - организует альтернативное представление результирующего набора SQL-запроса, в соответствии с типом метаданных заданным свойством ZSQLMetadata1.MetadataType.
Код:
 ZSQLMetadata1.Close;
ZSQLMetadata1.MetadataType := mdTables;
ZSQLMetadata1.Open;
while not ZSQLMetadata.Eof do
begin
ListBox1.Items.Add(ZSQLMetadata1.Fields[2].AsString);
ZSQLMetadata1.Next;
end;
Вот... Я думаю теории достаточно. Дальше несколько практических примеров (относящихся к ZeosLib и MySQL).


Добавлено: Как создать новую базу данных
Код:
procedure TForm1.btnCreateNewDBClick(Sender: TObject);
var
SQL: string;
CreateResult: Boolean;
begin
if not ZConnection1.Connected then
ZConnection1.Connected := True;

SQL := 'CREATE DATABASE IF NOT EXISTS `test_new_db_create`;';
try
CreateResult := ZConnection1.ExecuteDirect(SQL);
except
CreateResult := False;
end;

if CreateResult then
ShowMessage('Создание базы данных удалось!')
else
ShowMessage('Ошибка создания базы данных!');
end;
Как создать в базе данных новую таблицу
Код:
procedure TForm1.btnCreateNewTableClick(Sender: TObject);
var
SQL: string;
n: Integer;
begin
if not ZConnection1.Connected then
ZConnection1.Connected := True;

n := cbDataBases.ItemIndex; // индекс в листе баз данных

try
// переключаемся на базу данных
SQL := 'USE '+cbDataBases.Items[n]+';';				  { SQL := 'USE `test_new_db_create`;'; }
if ZConnection1.ExecuteDirect(SQL) then
begin
// удаляем таблицу если она уже есть
SQL := 'DROP TABLE IF EXISTS `'+edNewTable.Text+'`;';  { SQL := 'DROP TABLE IF EXISTS `new_table_test`;'; }
if ZConnection1.ExecuteDirect(SQL) then
begin
// создаем нову таблицу со следующей структурой
SQL := 'CREATE TABLE `'+edNewTable.Text+'` ( '#13#10+	{ SQL := 'CREATE TABLE `new_table_test` ( '#13#10+ }
' NIS varchar(9) DEFAULT NULL,'#13#10  +
' NAMA varchar(9) DEFAULT NULL,'#13#10 +
' ALAMAT varchar(9) DEFAULT NULL'#13#10 +
') ENGINE=InnoDB DEFAULT CHARSET=utf8;';
if ZConnection1.ExecuteDirect(SQL) then
ShowMessage('Таблица '+ edNewTable.Text+ ' создана!')
else
ShowMessage('Ошибка создания таблицы '+ edNewTable.Text+ '!');
end
else
ShowMessage('Ошибка удаления таблицы '+ edNewTable.Text+ '!');
end
else
ShowMessage('Ошибка переключения на базу данных '+ cbDataBases.Items[n]+ '!');
except
ShowMessage('Ошибка создания таблицы '+ edNewTable.Text+ '!');
end;
end;
Как добавить записи в таблицу
Код:
 // ... 
ZQuery1.SQL.Clear;
ZQuery1.SQL.Add('INSERT INTO `department` (`dep_id`, `dep_name`, `dep_shname`, `dep_address`) VALUES '); // INSERT INTO отрывает режим вставки
ZQuery1.SQL.Add('(1, ''Line agency'', ''RUS'', ''Novorossiysk Lenina st. 2''), '); // !! <-------------- ", " (запятая) - продолжение режима вставки
//... и.т.д 
ZQuery1.SQL.Add('(20, ''Container agency'', ''USA'', ''Krasnodar Komsomolskaya st. 17'');'); // !! <----- ";" (точка с запятой) закрывает режим вставки

try
ZQuery1.ExecSQL;
ShowMessage('Записи добавлены!');
except
ShowMessage('Ошибка записи в таблицу!');
end;

// ...
Примечание - создание новых баз (с таблицами и данными) эффеткивнее создавать путем импорта данных в формате MySQL-script (обычно из файла).
Пример скрипта:
1. Создается база с именем "new_database"
2. В базе создается таблица с именем "first_new_table" (если такая уже есть, то сначала убивается).
3. В таблицу с именем "first_new_table" заносятся данные (4 записи).
Код:
CREATE DATABASE IF NOT EXISTS `new_database`;

USE `new_database;

DROP TABLE IF EXISTS `first_new_table`;

CREATE TABLE IF NOT EXISTS `first_new_table` (
`eq_id` int(11) NOT NULL AUTO_INCREMENT,
`eq_name` varchar(30) DEFAULT NULL,
`eq_type` smallint(6) DEFAULT NULL,
`eq_cost` decimal(9,4) DEFAULT NULL,
`eq_date` date DEFAULT NULL,
`woff_date` date DEFAULT NULL,
PRIMARY KEY (`eq_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5;

INSERT INTO `first_new_table` (`eq_id`, `eq_name`, `eq_type`, `eq_cost`, `eq_date`, `woff_date`) VALUES
(1, 'Volvo', 1, '15000.0000', '1998-03-04', NULL),
(2, 'Laboratoy', 10, '40000.0000', '2001-10-07', NULL),
(3, 'Computer', 7, '900.0000', '1999-09-03', NULL),
(4, 'Radiostation', 19, '400.0000', '2000-07-08', NULL);
- Разделителем операций (в данном скрипте) является символ ";".
- Имена баз, таблиц и полей квотятся символом "`" (обратный апостроф)
- Строковые значения (в секции VALUES оператора INSERT) квотятся "'" (апостроф)
- Выполнять такой скрипт можно построчно (с помошью TZQuery или даже TZConnection), но гораздо эффективней будет работать TZSQLProcessor
Код:
 ZSQLProcessor1.LoadFromFile('C:\delphiDB.sql');
ZSQLProcessor1.Parse;
ZSQLProcessor1.Execute;
 

sinkopa

Well-Known Member
#9
Как сделать бэкап базы данных (Экспорт в MySQL-script файл)
1) Функция для извлечения (в MySQL строку) данных поля таблицы типа Blob
Код:
function BlobSteamToStr(var Steam: TMemoryStream; FreeOnFinish: Boolean = False): string;
var
len: Int64;
P: PByte;
begin
Result := '';
if (Steam = nil) then
Exit;
len := Steam.Size;
P := Steam.Memory;
while (len > 0) do
begin
Result := Result + IntToHex(P^,2);
Inc(P);
Dec(len);
end;
if (Length(Result) > 0) then
Result := '0x'+Result;

if FreeOnFinish then
begin
Steam.Free;
Steam := nil;
end;
end;
2) Функция для извлечения (в MySQL строку) структуры таблицы и ее записей
Код:
 // DbName - имя базы данных
// TableName - имя таблицы
// SqlText  - выходной параметр, результирующая строка в формате MySQL-script. 
// Результат - True, если все хорошо... :-)
function TForm1.BackupTable(DbName, TableName: string; var SqlText: string): Boolean;
const
rFrom = 'CREATE TABLE';
rTo  = 'CREATE TABLE IF NOT EXISTS';
var
rBefore: string;
ColTypes: TStringList;
B: TStream;
ColType: string;
SQLResult: string;
ColNames: string;
firstColumn: Boolean;
i,n: Integer;
procedure AppendColumnName(ColName: string);
begin
if firstColumn then
begin
ColNames := '`'+ ColName + '`';
firstColumn := False;
end
else
ColNames := ColNames + ', `'+ ColName + '`';
end;
begin
Result := False;
SQLResult := '';
rBefore := 'DROP TABLE IF EXISTS `'+TableName+'`;'#13#13;
ColTypes := TStringList.Create;
try
try
with ZReadOnlyQuery1 do
begin
Close;
SQL.Text := 'SHOW CREATE TABLE '+DbName+'.'+TableName+';';
Open;
Result := (RecordCount > 0);
First;
while Result and (not Eof) do
begin
SQLResult := SQLResult + Fields[1].AsString + ';'#13;
Next;
end;
Close;

if Result then
begin
SQLResult := StringReplace(SQLResult,''#10,''#13,[rfReplaceAll, rfIgnoreCase]);
SQLResult := StringReplace(SQLResult,rFrom,rTo,[rfReplaceAll, rfIgnoreCase]);
SQLResult := rBefore + SQLResult + #13;
SQL.Text:='SHOW COLUMNS FROM '+DbName+'.'+TableName+';';
Open;
Result := (RecordCount > 0);
First;
firstColumn := True;
while Result and (not Eof) do
begin
AppendColumnName(Fields[0].AsString);
ColTypes.Add(Fields[1].AsString);
Next;
end;
Close;
end;

if Result then
begin
SQLResult := SQLResult + #13;

SQL.Text:='SELECT '+ ColNames+' FROM '+DbName +'.'+ TableName+';';
Open;
if (RecordCount > 0) then
begin
n := ColTypes.Count - 1;
First;
while not Eof do
begin
Application.ProcessMessages;
SQLResult := SQLResult+'INSERT INTO '+TableName+' VALUES (';
for i := 0 to n do
begin
ColType := ColTypes[i];
if (Fields[i].IsBlob) and (Fields[i].AsString <> '') then
begin
B := CreateBlobStream(Fields[i],bmRead);
SQLResult := SQLResult + BlobSteamToStr(TmemoryStream(B),True);
end
else if (Fields[i].AsString = '') and (ColType <> 'text') and (Pos('char',ColType) < 1) then
SQLResult := SQLResult + 'NULL'
else if (ColType = 'datetime') then
SQLResult := SQLResult + '''' + FormatDateTime('yyyy-mm-dd hh:nn:ss',Fields[i].AsDateTime) + ''''
else if (ColType = 'date') then
SQLResult := SQLResult + '''' + FormatDateTime('yyyy-mm-dd',Fields[i].AsDateTime) + ''''
else if (ColType = 'blob') then
SQLResult := SQLResult + Fields[i].AsString
else if (Pos('int(',ColType) > 0 ) then
SQLResult := SQLResult + Fields[i].AsString
else
SQLResult := SQLResult + '''' + Fields[i].AsString + '''';
if (i <> n) then
SQLResult := SQLResult + ', ';
end;
SQLResult := SQLResult+');'#13;
Next;
end;
SQLResult := SQLResult + #13;
end;
Close;
end;
end;
except
Close;
Result := False;
end;
finally
if Result then
SqlText := SqlText + SQLResult;
ColTypes.Free;
end;
end;
Использование
Код:
procedure TForm1.btnBackupDBClick(Sender: TObject);
var
SQLFile: TStringList; 
Result: string;
DBName: string;
begin
Result:='';
if not dlgSave.Execute then Exit;

DBName := 'delphi';

try
{ предварительная проверка на наличие базы с таким именем }

if not ZConnection1.ExecuteDirect('USE '+DBName+';') then
Exit;

ZConnection1.ShowSQLHourGlass;

with ZQuery1 do
begin
Close;

{ Запрос списка таблиц }
SQL.Text:='SHOW TABLES';
Open;
First;

Result := Result + 'CREATE DATABASE IF NOT EXISTS `'+DBName+'`;'#13#13;
Result := Result + 'USE `'+DBName+'`;'#13#13;

{ Экспорт таблиц базы по списку }
while not Eof do
begin
Application.ProcessMessages;
if not BackupTable(DbName,Fields[0].AsString,Result) then
begin
Result:='';
Break; 
end; 
Next;
end

end;

if (Length(Result) > 0) then
begin
SQLFile := TStringList.Create;
SQLFile.Text := Result;
SQLFile.SaveToFile(dlgSave.FileName);
ShowMessage('База данных "'+DBName+'" сохранена!');
end
else
ShowMessage('Не получилось сохранить базу данных "'+DBName+'"!');

finally
SQLFile.Free;
ZQuery1.Close; 
ZConnection1.HideSQLHourGlass;
end;
end;
Примечание - Такой способ Экспорта (создания резервных копий) баз данных стоит рассматривать как пример работы библиотеки.
Реально применять его стоит только в случае, если объем сохраняемых данных в базе очень небольшой. (Мне лично встречались базы объемом по несколько сотен мегабайт)
Ну или когда нет никакой возможности получить доступ к локальным консольным утилитам MySQL на стороне сервера.
Подробнее тут:
MySQL 5.5 Reference Manual :: 7 Backup and Recovery
MySQL 5.5 Reference Manual :: 7.2 Database Backup Methods

Если же требуется создать быструю локальную (на строне сервера) копию данных таблицы, это можно сделать следующим SQL-запросом:
Код:
 SQL := 'SELECT * INTO OUTFILE ''/tmp/delphi_cargo_backup.txt'' FROM delphi.cargo;';
ZConnection1.ExecuteDirect(SQL)
Если Денвер у Вас установлен так как я рекомендовал (в первом посте) и вы выполнили данный код, то созданный файл должен находится в директории "tmp", в корне диска с Денвером.
Про синтаксис SELECT * INTO OUTFILE, подробнее тут:
MySQL 5.5 Reference Manual :: 13.2.9.1 SELECT ... INTO Syntax
Чтобы загрузить, сохраненные таким образом записи, обратно в таблицу:
Код:
 SQL := 'LOAD DATA INFILE ''/tmp/delphi_cargo_backup.txt'' INTO TABLE delphi.cargo;';
ZConnection1.ExecuteDirect(SQL)
Про синтаксис, подробнее тут:
MySQL 5.5 Reference Manual :: 13.2.6 LOAD DATA INFILE Syntax
 

sinkopa

Well-Known Member
#10
Как получить список пользователей на сервере MySQL
На форме:
Код:
type
TForm1 = class(TForm)
ZConnection1: TZConnection;
ZReadOnlyQuery1: TZReadOnlyQuery;
ListBox1: TListBox;
btnShowUsers: TButton;
procedure btnShowUsersClick(Sender: TObject);
private
public
end;
Код:
Код:
procedure TForm1.btnShowUsersClick(Sender: TObject);
var
s: string;
begin
if not ZConnection1.Connected then
ZConnection1.Connect;

ListBox1.Clear;

try
with ZReadOnlyQuery1 do
begin
Close;
SQL.Text := 'SELECT User, Host FROM mysql.user;';
Open;
First;
while not Eof do
begin
ListBox1.Items.Add(Fields[0].AsString+'@'+Fields[1].AsString); //userName@userHost
Next;
end;
end;
finally
ZReadOnlyQuery1.Close;
end;
end;
Как отобразить (на форме) привилегии пользователя на сервере MySQL
(1) Кладем на форму TCheckListBox (CheckListBox1) и заполняем его Items следующими элементами (по типам привилегий):
Данные сказал(а):
SELECT, INSERT, UPDATE, DELETE, FILE
+
Структура сказал(а):
CREATE, ALTER, INDEX, DROP, CREATE TEMPORARY TABLES, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE, CREATE VIEW, EVENT, TRIGGER
+
Администрирование сказал(а):
GRANT, SUPER, PROCESS, RELOAD, SHUTDOWN, SHOW DATABASES, LOCK TABLES, REFERENCES, REPLICATION CLIENT, REPLICATION SLAVE, CREATE USER
(2) Функция приведения привилегии к имени поля результирующего запроса:
Код:
function Cap2Priv(s: string): string;
begin
Result := '';
if (s = 'SELECT') then Result := 'Select_priv'
else if (s = 'INSERT') then Result := 'Insert_priv'
else if (s = 'UPDATE') then Result := 'Update_priv'
else if (s = 'DELETE') then Result := 'Delete_priv'
else if (s = 'CREATE') then Result := 'Create_priv'
else if (s = 'DROP') then Result := 'Drop_priv'
else if (s = 'RELOAD') then Result := 'Reload_priv'
else if (s = 'SHUTDOWN') then Result := 'Shutdown_priv'
else if (s = 'PROCESS') then Result := 'Process_priv'
else if (s = 'FILE') then Result := 'File_priv'
else if (s = 'GRANT') then Result := 'Grant_priv'
else if (s = 'REFERENCES') then Result := 'References_priv'
else if (s = 'INDEX') then Result := 'Index_priv'
else if (s = 'ALTER') then Result := 'Alter_priv'
else if (s = 'SHOW DATABASES') then Result := 'Show_db_priv'
else if (s = 'SUPER') then Result := 'Super_priv'
else if (s = 'CREATE TEMPORARY TABLES') then Result := 'Create_tmp_table_priv'
else if (s = 'LOCK TABLES') then Result := 'Lock_tables_priv'
else if (s = 'EXECUTE') then Result := 'Execute_priv'
else if (s = 'REPLICATION SLAVE') then Result := 'Repl_slave_priv'
else if (s = 'REPLICATION CLIENT') then Result := 'Repl_client_priv'
else if (s = 'CREATE VIEW') then Result := 'Create_view_priv'
else if (s = 'SHOW VIEW') then Result := 'Show_view_priv'
else if (s = 'CREATE ROUTINE') then Result := 'Create_routine_priv'
else if (s = 'ALTER ROUTINE') then Result := 'Alter_routine_priv'
else if (s = 'CREATE USER') then Result := 'Create_user_priv'
else if (s = 'EVENT') then Result := 'Event_priv'
else if (s = 'TRIGGER') then Result := 'Trigger_priv'
else if (s = 'CREATE TABLESPACE') then Result := 'Create_tablespace_priv';
end;
(3) Процедура отображения привилегий пользователя:
Код:
procedure TForm1.ShowPrivileges(const User, Host: string);
var
F: TField;
i: Integer;
begin
with ZReadOnlyQuery1 do
begin
Close;
SQL.Text := 'SELECT * FROM mysql.user WHERE ( User='''+ User +''' AND Host='''+Host+''' );';
Open;
First;
for i := 0 to CheckListBox1.Count-1 do
begin
CheckListBox1.Checked[i] := False;
F := FieldByName(Cap2Priv(CheckListBox1.Items[i]));
if (F <> nil) then
CheckListBox1.Checked[i] := F.AsBoolean;
end;
Close;
end;
end;
(4) Использование :)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
UserName: string; 
HostName: string; 
begin
UserName := 'delphi'; 
HostName := 'localhost'; 

if not ZConnection1.Connected then
ZConnection1.Connect;

ShowPrivileges(UserName,HostName); 
end;
 

sinkopa

Well-Known Member
#11
Как создать нового пользователя на сервере MySQL
Код:
procedure TForm1.btnCreateUserClick(Sender: TObject);
var
UserName, UserHost, UserPass: string;
SQL: string;
begin
UserName := 'delphitester'; // логин
UserHost := 'localhost';	 // имя хоста, с которого пользователь может подключаться к серверу MySQL
// "localhost" - только с локальной точки (компьютер где находится MySQL сервер)
// "%" - с любого места на "просторах вселенной" :-)

UserPass := 'delphitester'; // пароль для подключения к серверу
// "" (пустой) - для подключения данного пользователя пароль не требуется


SQL := 'CREATE USER ''' + UserName + '''@''' + UserHost + '''';
if (UserPass = '') then
SQL := SQL +';'
else
SQL := SQL + ' IDENTIFIED BY ''' + UserPass + ''';';

if not ZConnection1.Connected then
ZConnection1.Connect
else
ZConnection1.DbcConnection.GetMetadata.ClearCache; // очистка кэша метаданных

if ZConnection1.ExecuteDirect(SQL) then
ShowMessage('Пользователь создан!')
else
ShowMessage('Пользователь не создан');
end;
Как назначить/изменить привилегии пользователя на сервере MySQL
(1) На форме TCheckListBox (CheckListBox1) заполненный элементами с именами привилегий (как я указывал выше).
(2) Отмечаем чекбоксы с привилегиями, которые необходимо задать пользователю.
(3) Код:
Код:
procedure TForm1.btnSetUserPrivilegesClick(Sender: TObject);
var
UserName, UserHost, UserPass: string;
DBName, TableName: string;
RevokeSQL: string;
PrivilegesSQL: string;
i,ChkCount: Integer;
begin
UserName := 'delphitester'; // логин пользователя !в поле таблицы привилегий сервера MySQL!
UserHost := 'localhost';	 // имя хоста пользователя !в поле таблицы привилегий сервера MySQL! 
UserPass := 'delphitester'; // пароль пользователя !в поле таблицы привилегий сервера MySQL! 

DBName := '*';			  // база данных для которой устанавливаются привилегии пользователя
// "*" - все базы данных на сервере

TableName := '*';			// таблица в базе данных DBName, для которой устанавливаются привилегии пользователя
// "*" - все таблицы базы данных DBName

{ !!! В таблице привилегий сервера MySQL может существовать несколько записей. Например:
Пользователю "delphitester@localhost" - могут быть выставлены ВСЕ привилегии
для базы "delphitest" и (другая запись) только таблица "cargo" в базе "delphi" с правами "SELECT, UPDATE"; 
} 

ChkCount := 0; // счетчик отмеченных в CheckListBox1 элементов
PrivilegesSQL := 'GRANT ';

for i := 0 to CheckListBox1.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
if (ChkCount = 0) then
PrivilegesSQL := PrivilegesSQL + CheckListBox1.Items[i]
else
PrivilegesSQL := PrivilegesSQL + ' ,'#13 + CheckListBox1.Items[i];
Inc(ChkCount);
end;
end;

if (ChkCount < 1 ) then
begin
if MessageBox(Handle, PChar(Format('Вы не назначили пользователю "%s" прав!' + #13#10
+ 'Продолжить для обнуления?', [UserName])), PChar(Application.Title), MB_YESNO +
MB_ICONWARNING + MB_TOPMOST) = IDNO then Exit;
end
else
begin
PrivilegesSQL := PrivilegesSQL + ' ON '+DBName+'.'+TableName+' TO ''' + UserName + '''@''' + UserHost + '''';
if (UserPass <> '') then
PrivilegesSQL := PrivilegesSQL + ' IDENTIFIED BY ''' + UserPass + ''';'
else
PrivilegesSQL := PrivilegesSQL + ';';
end; 

RevokeSQL := 'REVOKE ALL ON '+DBName+'.'+TableName+' FROM ''' + UserName + '''@''' + UserHost + '''';
if (UserPass <> '') then
RevokeSQL := RevokeSQL + ' IDENTIFIED BY ''' + UserPass + ''';'
else
RevokeSQL := RevokeSQL + ';';


if not ZConnection1.Connected then
ZConnection1.Connect
else
ZConnection1.DbcConnection.GetMetadata.ClearCache;

{ обнуление старых привилегий }
if ZConnection1.ExecuteDirect(RevokeSQL) then
begin
{ назначение новых привилегий }
if (ChkCount > 0 ) and ZConnection1.ExecuteDirect(PrivilegesSQL) then
ShowMessage('Старые права обнулены, новые права назначены')
else
ShowMessage('Права пользователя обнулены!');
end
else
ShowMessage('Права обнулить не удалось! Может у Вас недостаточно прав для этого?');

{ перезагрузить привилегии }
ZConnection1.ExecuteDirect('FLUSH PRIVILEGES;'); 

end;
Ну что? Достаточно примеров? ;)
Вот, если нужно, проект в котором я тестировал все что понаписал выше:
Посмотреть вложение ZeosTest.rar
 
21.01.2013
7
0
38
Барнаул
#12
Как создать нового пользователя на сервере MySQL
Код:
procedure TForm1.btnCreateUserClick(Sender: TObject);
var
UserName, UserHost, UserPass: string;
SQL: string;
begin
UserName := 'delphitester'; // логин
UserHost := 'localhost';	 // имя хоста, с которого пользователь может подключаться к серверу MySQL
// "localhost" - только с локальной точки (компьютер где находится MySQL сервер)
// "%" - с любого места на "просторах вселенной" :-)

UserPass := 'delphitester'; // пароль для подключения к серверу
// "" (пустой) - для подключения данного пользователя пароль не требуется


SQL := 'CREATE USER ''' + UserName + '''@''' + UserHost + '''';
if (UserPass = '') then
SQL := SQL +';'
else
SQL := SQL + ' IDENTIFIED BY ''' + UserPass + ''';';

if not ZConnection1.Connected then
ZConnection1.Connect
else
ZConnection1.DbcConnection.GetMetadata.ClearCache; // очистка кэша метаданных

if ZConnection1.ExecuteDirect(SQL) then
ShowMessage('Пользователь создан!')
else
ShowMessage('Пользователь не создан');
end;
Как назначить/изменить привилегии пользователя на сервере MySQL
(1) На форме TCheckListBox (CheckListBox1) заполненный элементами с именами привилегий (как я указывал выше).
(2) Отмечаем чекбоксы с привилегиями, которые необходимо задать пользователю.
(3) Код:
Код:
procedure TForm1.btnSetUserPrivilegesClick(Sender: TObject);
var
UserName, UserHost, UserPass: string;
DBName, TableName: string;
RevokeSQL: string;
PrivilegesSQL: string;
i,ChkCount: Integer;
begin
UserName := 'delphitester'; // логин пользователя !в поле таблицы привилегий сервера MySQL!
UserHost := 'localhost';	 // имя хоста пользователя !в поле таблицы привилегий сервера MySQL! 
UserPass := 'delphitester'; // пароль пользователя !в поле таблицы привилегий сервера MySQL! 

DBName := '*';			  // база данных для которой устанавливаются привилегии пользователя
// "*" - все базы данных на сервере

TableName := '*';			// таблица в базе данных DBName, для которой устанавливаются привилегии пользователя
// "*" - все таблицы базы данных DBName

{ !!! В таблице привилегий сервера MySQL может существовать несколько записей. Например:
Пользователю "delphitester@localhost" - могут быть выставлены ВСЕ привилегии
для базы "delphitest" и (другая запись) только таблица "cargo" в базе "delphi" с правами "SELECT, UPDATE"; 
} 

ChkCount := 0; // счетчик отмеченных в CheckListBox1 элементов
PrivilegesSQL := 'GRANT ';

for i := 0 to CheckListBox1.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
if (ChkCount = 0) then
PrivilegesSQL := PrivilegesSQL + CheckListBox1.Items[i]
else
PrivilegesSQL := PrivilegesSQL + ' ,'#13 + CheckListBox1.Items[i];
Inc(ChkCount);
end;
end;

if (ChkCount < 1 ) then
begin
if MessageBox(Handle, PChar(Format('Вы не назначили пользователю "%s" прав!' + #13#10
+ 'Продолжить для обнуления?', [UserName])), PChar(Application.Title), MB_YESNO +
MB_ICONWARNING + MB_TOPMOST) = IDNO then Exit;
end
else
begin
PrivilegesSQL := PrivilegesSQL + ' ON '+DBName+'.'+TableName+' TO ''' + UserName + '''@''' + UserHost + '''';
if (UserPass <> '') then
PrivilegesSQL := PrivilegesSQL + ' IDENTIFIED BY ''' + UserPass + ''';'
else
PrivilegesSQL := PrivilegesSQL + ';';
end; 

RevokeSQL := 'REVOKE ALL ON '+DBName+'.'+TableName+' FROM ''' + UserName + '''@''' + UserHost + '''';
if (UserPass <> '') then
RevokeSQL := RevokeSQL + ' IDENTIFIED BY ''' + UserPass + ''';'
else
RevokeSQL := RevokeSQL + ';';


if not ZConnection1.Connected then
ZConnection1.Connect
else
ZConnection1.DbcConnection.GetMetadata.ClearCache;

{ обнуление старых привилегий }
if ZConnection1.ExecuteDirect(RevokeSQL) then
begin
{ назначение новых привилегий }
if (ChkCount > 0 ) and ZConnection1.ExecuteDirect(PrivilegesSQL) then
ShowMessage('Старые права обнулены, новые права назначены')
else
ShowMessage('Права пользователя обнулены!');
end
else
ShowMessage('Права обнулить не удалось! Может у Вас недостаточно прав для этого?');

{ перезагрузить привилегии }
ZConnection1.ExecuteDirect('FLUSH PRIVILEGES;'); 

end;
Ну что? Достаточно примеров? ;)
Вот, если нужно, проект в котором я тестировал все что понаписал выше:
Посмотреть вложение 5505

Думаю сегодня долгая ночь будет (жена не дождется :) ), все пробывать буду!

Если можно то как в Zeos считывать, перезаписывать, создавать и удалять опрделенные данные в мускуле если нужно изменить 1-5 полей в таблице или нет такого?

Уникальный пост получился!
:) Мега спасибо за помощь!
Прям неудобно даже как то столько инфы, может денег на сотку закинуть или wmz в кошелек скините данные честно отблагодарю (хоть зарабатываю не много, семья, но тем неменее), да и многие присоединятся думаю, такой информации в интернете не найти.
Огромное, огромное спасибо Вам!
 

sinkopa

Well-Known Member
#13
Если можно то как в Zeos считывать, перезаписывать, создавать и удалять опрделенные данные в мускуле если нужно изменить 1-5 полей в таблице или нет такого?
Я не совсем въехал в суть Вашего вопроса... ;)
Если у Вас на форме DBGrid связанный с базой через ZQuery (как я описывал)
Код:
 { Связи (можно сразу выставить в Дизайнере) }
ZQuery1.Connection := ZConnection1;
DataSource1.DataSet := ZQuery1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
то после
Код:
 ZQuery1.SQL.Text := 'SELECT * FROM delphi.cargo';
ZQuery1.Active := True;
в гриде отобразятся данные Вашей таблицы.
ну... и делайте там (в гриде) все что Вам угодно (добавляйте,редактируйте, удаляйте)... Все изменения сразу же синхронно применятся на сервере...
А если Вам надо программно в коде... то это вопрос не про Zeos... а про синтаксис SQL запросов...
считывать - это SELECT ... FROM ... WHERE ... ;
перезаписывать - это UPDATE ... SET ... WHERE ... ;
создавать - это INSERT ... INTO ... VALUES ... ;
удалять - DELETE ... FROM ... WHERE ...;
Это Вам сюда тогда нужно:
MySQL 5.5 Reference Manual
MySQL - справочное руководство на русском
:) Мега спасибо за помощь!
Прям неудобно даже как то столько инфы, может денег на сотку закинуть или wmz в кошелек скините данные честно отблагодарю (хоть зарабатываю не много, семья, но тем неменее), да и многие присоединятся думаю, такой информации в интернете не найти.
Огромное, огромное спасибо Вам!
Спасибо - это много слишком... тут говорят, плюсики вроде разрешается ставить... :)
 
21.01.2013
7
0
38
Барнаул
#14
Спасибо - это много слишком... тут говорят, плюсики вроде разрешается ставить... :)
С удовольствием поставил, но даенная функция для меня как новенького пока недоступна :(


Вроде разобрался со всем, примеры и исходник супер помогли мне понять как работает ZeosLib.
Одно только огорчило, что при считывании таблицы в некоторых столбцах вместо данных отображается (memo) :( , а данные с этих столбцов жизнено необходимы для работоспособности программы.
Может подскажите почему так? :)

Чтобы не изобретать велосипед вдруг у вас есть чтото подобное :) (просто кусок кода, дальше сам разбирусь)
Мне необходимо считать особой разницы нет хоть в memo или listbox с мускула имя_бд ---> имя таблицы --> имя столбца --> содержимое столбца в memo или listbox -- растыковка с мускулом
{делаю обработку или чистку.... кучу всего}
и потом стыковка с мускулом и перезапись стобца на место.
А то мысли в тупик заходя :what?: т, мысли были такие:
1) if to do
begin
DELETE ... FROM ... WHERE ...
end;
2) TTimer
------------
Более 30 тысяч запросов выполнять это :crash: для сервера.

За ранее очень благодарен.
С уважением

;)
 

sinkopa

Well-Known Member
#15
Вроде разобрался со всем, примеры и исходник супер помогли мне понять как работает ZeosLib.
Одно только огорчило, что при считывании таблицы в некоторых столбцах вместо данных отображается (memo) :) , а данные с этих столбцов жизнено необходимы для работоспособности программы.
Может подскажите почему так? ;)
Хм... то ли Вы не внимательно читали... то ли мы с вами на разных языках разговариваем... :crash:
ZeosLib - (говоря моим языком) Это библиотека, предназначенная для того, чтобы Вы могли с MySQL работать точно так же как с любыми другими базами данных...
т.е. стандартными Delphi контролами, со всеми вытекающими последствиями... ZeosLib, это просто связь с MySQL... как BDE, ADO и пр...
Говоря (Вашим языком) - ZeosLib умеет все, что умеют "стандартные" Delphi компоненты (плюс некоторые нюансы и доп возможности на которые я Вам указал)...
Поэтому "огорчения мне Ваши непонятны".
Короче... в стандарнтых Delphi демах есть пример: C:\Program Files\Borland\Delphi7\Demos\Db\FishFact\fishfact.dpr
(1) Откройте его, скомпилируйте и убедитесь что он у Вас работает, показывает мемо и картинки.
(2) Скачайте вот этот, слегка модифицированный мной FishFact демо: Посмотреть вложение FishFact.rar
(3) Скомпильте, запустите и нажмите последовательно три кнопки которые я добавил.
1-я кнопка создаст в MySQL-е такую же базу и такую же таблицу.
2-я кнопка переключит контролы на отображение базы из BDE.
3-я кнопка переключит контролы на отображение базы (с теми же данными) только из MySQL.
(4) Попробуйте отыскать отличия... :)
 
21.01.2013
7
0
38
Барнаул
#17
(4) Попробуйте отыскать отличия... :)
Хм... то ли Вы не внимательно читали... - Все читал, от и до для меня эта информация очень важна!
то ли мы с вами на разных языках разговариваем... :( - Нет ваш язык мне понятен но в меру моих знаний.

- Скомпелировал обе демки :( не нашел различий да и при выводе данных, что там (мемо), что в другом примере (мемо).
Изучать продолжу mysql и delphi в теории, так как нужных примеров для продалжения работы нет.
1. Вопрос с (memo) - не решен, как выводить не знаю или как одельно считать незнаю и не нашел по всем ру поисковикам прошелся 3-4 страницы одно молоко, по теме и загадки.
2.
-----
Мне необходимо считать особой разницы нет хоть в memo или listbox с мускула имя_бд ---> имя таблицы --> имя столбца --> содержимое столбца в memo или listbox -- растыковка с мускулом
{делаю обработку или чистку.... кучу всего}
и потом стыковка с мускулом и перезапись стобца на место.
-----
Как, что неполучается ничего. Вообщем :lamer: . Бросте меня в терновый куст и закройте тему!

P.S. Жаль 5 лет норм работал программистом прийдется увольнятся, много что знаю и умею, но в mysql :) как то небыло необходимости изучать, даже в программах старался обходится без баз данных sql,
а тут срочное задание организовать доступ и сделать программу, для меня честно чем понять с теории что и как проще самому придумать и организовать свой собственный формат баз данных, собствено что я раньше и делал до данного задания. Вообщем такая вот печалька.
Обработка полученых данных и написание программы не проблема, за сутки-двое бы написал, а вот с получением данных как выше описал. :(

Тем неменее огромное спасибо за помощь, видно не судьба написать мне данную программу!
 

sinkopa

Well-Known Member
#18
Бросте меня в терновый куст и закройте тему!
...
P.S. Жаль 5 лет норм работал программистом прийдется увольнятся,
...
видно не судьба написать мне данную программу!
Это что? истерика? :)
Вы лучше вопрос задайте конкретный (пока у Вас только абстрактные получаются)...
Вопрос (желательно) в форме вида:
Есть база c именем "база_1" и таблицей "таблица_1" с полями:
поле_1 - <тип поля>
поле_2 - <тип поля>
...
поле_n - <тип поля>
Необходимо, (например по нажатию на кнопку_1)
1. подключиться,
2. выбрать данные из столбца(ов) "поле_2, ..." соответствующие условию (условие)...
3. после этого (например по нажатию на кнопку_1)...
и.т.д...
тогда и ответ получится... э... конкретный?... :lamer:
 
21.01.2013
7
0
38
Барнаул
#19
Это что? истерика? :)
Вы лучше вопрос задайте конкретный (пока у Вас только абстрактные получаются)...
Вопрос (желательно) в форме вида:
тогда и ответ получится... э... конкретный?... :lamer:
Это что? истерика? - Да есть такое, работу не хочется потерять.

Задаю конкретный вопрос:

Есть база c именем "basemed_1" и таблицей "klient" с столбцами:
"id" - <medimint отображается через ваш пример>;
"idgk" - <enum отображается через ваш пример>;
"name" - <varchar отображается через ваш пример>;
"adress" - <varchar отображается через ваш пример>;
"gk" - <enum отображается через ваш пример>;
"descript" - <text - отображается вместо данных (memo)>;
"date" - <date - отображается через ваш пример>;
"adddate" - <int - отображается через ваш пример>;
... еще около 6-7 названий ...

По нажатию кнопки 1 необходимо считать информацию с таблицы "klient" в TDBGrid разъединяюсь с базой.

Далее сам делаю обработку удаляю по списку строки с ненужной информацией, провожу работу над орф. ошибками ,
потом исправляю программно информацию в полях столбцов date, idgk, adress, - думаю что осилю разберусь TDBGrid если что то прочту в книгах интернете благо информации предостаточно про TDBGrid.

и descript - данные не отображаются как что сделать вообще не знаю, а с этого столбца данные надо еще и в listbox или строками в мемо запихнуть если бы данные отображались думаю проблем бы не было скопировать после редактирования.

По нажатию кнопки 2 соединяюсь с базой и перезаписываю измененную таблицу с TDBGrid вместо бд "klient" (типы столбцов остаются теми же что и были раньше) разъединяюсь с базой.

Вопросы:
1.Как считать информацию с таблицы "klient" в TDBGrid чтобы столбец "descript" отображался (или другое решение чтобы поработать с данными в столбце и вернуть их обратно)?
2.Как считать информацию с таблицы "klient" столбца "descript" к примеру в listbox1?
3.Как корректно разъединится с базой чтобы можно было поработать с импортированными данными в TDBGrid?
4.Как заменить старую таблицу "klient" в mysql на отредактированную чтобы не изменились типы столбцов экспортируемых из TDBGrid на место "klient"?

За ранее благодарен за помощь.
 

-master-

Well-Known Member
14.01.2012
616
20
#20
начните с изучения sql, тут без него не получится работать, а он на все вопросы вам ответит быстро и качественно.