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

Тема в разделе "Delphi - Базы данных", создана пользователем basenowse, 21 янв 2013.

  1. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Доброго времени суток уважаемые пользователи форума.
    Нужен исходник, пример с коментами на рус. языке по онлайн работе c базами данных mysql в Delphi 7 с использованием стандартных или бесплатных компонентов под OC Windows XP.
    Погуглил примеров исходников маловато нашлось.
    Если у кого есть киньте в лс, за ранее спасибо.
    С уважением
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Хм... примеров то "накидать" не сложно... Вот только будут ли они (мои примеры) у Вас работать? :)
    Давайте начнем с того что подготовим "площадку для тестов и экспериментов".
    Нам понадобятся:
    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]
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    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 проект).
    Установка закончена.
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Проверяем нашу тестовую площадку на "готовность к бою"
    1. Стартуем Денвер.
    2. Создаем новый Delphi проект.
    3. На форму кладем компонент "ZConnection" (на закладке Zeos Access) и кнопку.
    4. В обработчите клика пишем код:
    Код (Delphi):
    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
     
  5. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте, благодарю Вас за отклик!
    Все прошло как по маслу, все установил.
    Без ошибок и с первого раза.
    Подключение произошло успешно, площадка готова. :rolleyes:
    Вопросов по установке и настройки нет.
    В ожидании примеров работы c MySQL и ZeosLib.
    С уважением
     
  6. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Благодарен за ответы, в ожидании примеров работы c базами данных MySQL и компонентов ZeosLib.
    Пожалуйста дайте примеры, работа с данными компонентами практически не описана в интернете.
    С уважением
     
  7. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Я вернулся... :)
    Прошу сильно не бить, причины отсутствия были уважительные.
    К тому же как выяснилось в синтаксисе запросов MySQL 5.x произошли некоторые изменения.
    Пришлось немножко "проапгрейдить" мозги... :)
    Что и Вам советую: http://dev.mysql.com/doc/refman/5.5/en/index.html

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

    Компоненты ZeosLib

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

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

    //...

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

    sinkopa Well-Known Member

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

    TZStoredProc (Хранимая Процедура) - аналог компонента TStoredProc находящегося на закладке BDE
    Результирующий набор хранимой процедуры, может быть обработан так же, как результат SQL запроса выполненного любым другим способом (например TZQuery).
    Замечание:
    - Если хранимая процедура возвращает результирующий набор данных, то активировать ее следует вызовом метода Open:
    Код (Delphi):
     ZStoredProc1.Close;
    ZStoredProc1.ParamByName ('Name').Value := 'ValueForParam_Name';
    ZStoredProc1.Open;
    - Если хранимая процедура не имеет результирующего набора данных, то ее следует выполнять вызовом метода ExecProc:
    Код (Delphi):
     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;)
    Код (Delphi):
    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
    Код (Delphi):
     ZQuery1.SQL.Text:= 'FLUSH PRIVILEGES';
    ZQuery1.ExecSQL;
    (2) TZQuery позволяет синхронизировать данные (связанные с SQL запросом) в направлениях слиент->сервер и сервер->слиент.
    Класическое использование TZQuery (точно также как с BDE TQuery):
    На форме
    Код (Delphi):
    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;
    Использование
    Код (Delphi):
    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:
    Код (Delphi):
    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.
    Код (Delphi):
     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).


    Добавлено: Как создать новую базу данных
    Код (Delphi):
    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;
    Как создать в базе данных новую таблицу
    Код (Delphi):
    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;
    Как добавить записи в таблицу
    Код (Delphi):
     // ...
    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 записи).
    Код (Text):
    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
    Код (Delphi):
     ZSQLProcessor1.LoadFromFile('C:\delphiDB.sql');
    ZSQLProcessor1.Parse;
    ZSQLProcessor1.Execute;
     
  9. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Как сделать бэкап базы данных (Экспорт в MySQL-script файл)
    1) Функция для извлечения (в MySQL строку) данных поля таблицы типа Blob
    Код (Delphi):
    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 строку) структуры таблицы и ее записей
    Код (Delphi):
     // 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;
    Использование
    Код (Delphi):
    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-запросом:
    Код (Delphi):
     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
    Чтобы загрузить, сохраненные таким образом записи, обратно в таблицу:
    Код (Delphi):
     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
     
  10. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Как получить список пользователей на сервере MySQL
    На форме:
    Код (Delphi):
    type
    TForm1 = class(TForm)
    ZConnection1: TZConnection;
    ZReadOnlyQuery1: TZReadOnlyQuery;
    ListBox1: TListBox;
    btnShowUsers: TButton;
    procedure btnShowUsersClick(Sender: TObject);
    private
    public
    end;
    Код:
    Код (Delphi):
    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 следующими элементами (по типам привилегий):
    +
    +
    (2) Функция приведения привилегии к имени поля результирующего запроса:
    Код (Delphi):
    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) Процедура отображения привилегий пользователя:
    Код (Delphi):
    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) Использование :)
    Код (Delphi):
    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;
     
  11. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Как создать нового пользователя на сервере MySQL
    Код (Delphi):
    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) Код:
    Код (Delphi):
    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
     
  12. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0

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

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

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Я не совсем въехал в суть Вашего вопроса... ;)
    Если у Вас на форме DBGrid связанный с базой через ZQuery (как я описывал)
    Код (Delphi):
     { Связи (можно сразу выставить в Дизайнере) }
    ZQuery1.Connection := ZConnection1;
    DataSource1.DataSet := ZQuery1;
    DBGrid1.DataSource := DataSource1;
    DBNavigator1.DataSource := DataSource1;
    то после
    Код (Delphi):
     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 - справочное руководство на русском
    Спасибо - это много слишком... тут говорят, плюсики вроде разрешается ставить... :)
     
  14. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    С удовольствием поставил, но даенная функция для меня как новенького пока недоступна :(


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

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

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

    ;)
     
  15. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Хм... то ли Вы не внимательно читали... то ли мы с вами на разных языках разговариваем... :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) Попробуйте отыскать отличия... :)
     
  16. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Спасибо попробую разобраться
     
  17. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Хм... то ли Вы не внимательно читали... - Все читал, от и до для меня эта информация очень важна!
    то ли мы с вами на разных языках разговариваем... :( - Нет ваш язык мне понятен но в меру моих знаний.

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

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

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Это что? истерика? :)
    Вы лучше вопрос задайте конкретный (пока у Вас только абстрактные получаются)...
    Вопрос (желательно) в форме вида:
    тогда и ответ получится... э... конкретный?... :lamer:
     
  19. basenowse

    basenowse Member

    Регистрация:
    21 янв 2013
    Сообщения:
    7
    Симпатии:
    0
    Это что? истерика? - Да есть такое, работу не хочется потерять.

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

    Есть база 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"?

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

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    начните с изучения sql, тут без него не получится работать, а он на все вопросы вам ответит быстро и качественно.
     
Загрузка...

Поделиться этой страницей