Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 19.07.2018, 16:23   #1
Adminisrator
Пользователь
 
Регистрация: 19.07.2018
Сообщений: 12
Репутация: 10
По умолчанию Отправить много данных в MySQL

Пытаюсь в RAD Studio DX 10.2 считать данные из MSSQL данные и синхронизировать либо просто перекинуть в MySQL.
Данных около 50.000 записей (примерно7Мб). Использую TADOQuery и TADOConnection.
К обеим БД успешно подключился и из MSSQL получаю данные.
Из MSSQL имею либо многострочный файл на диске, либо TStringList наполненый данными.
Каждая строка файла - это одна запись данных,
либо
Каждая строка в TStringList'е - это одна запись данных.
Данные выглядят так:

Код:

INSERT INTO `database`.`db_table`(`ArtikelID`, `ManufacturerName`, `ManufacturerPN`, `Supplier`, `SupplierPN`, `Description`, `PhotoURL`, `Price`, `Quantity`, `Currency`, `Lagerplatz`) VALUES ('471', 'Analog Devices', 'AD780BRZ', 'Firma', '000000482', 'V-REF AD780BRZ  SO8 - AD780BRZ Analog Devices 8 ld SOIC', '-', '9,9', '0', 'EUR', '');


Поле "Description" имеет тип "текст" и содержит в себе текст (включая преносы строк).

Я не профи. Пользуюсь delphi изредка, потому заранее прошу прощения за возможные "элементарные" вопросы.

Хотелось бы одним циклом и без промежуточного сохранения на диск прогнать все данные одним потоком в MySQL.
С TStream не умею работать, но понимаю, что возможно тут это надо использовать.
Прошу, накидайте пример как действовать. Не забудьте что записей(инсёртов) много, и возможно надо делать считывание из TStringList и отправку в MySQL порциями.
Adminisrator вне форума   Ответить с цитированием
Старый 19.07.2018, 19:09   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,742
Репутация: 2097
По умолчанию

Использую TADOQuery и TADOConnection.
Цитата:
К обеим БД успешно подключился и из MSSQL получаю данные.
ЗНАЧИТ
есть qMSSQL: TADOQuery с данными MSSQL
и есть qMySQL: T..Query для ЗАПИСИ в MySQL

1. надеюсь это "нормальный" НД , т.е. МНОЖЕСТВО полей а не одно единственное поле с содержимым приведенного выше вида

Код:

//задаем запрос ВСТАВКИ(insert) с ПАРАМЕТРАМИ
http://www.programmersforum.ru/showpost.php?p=1451017&postcount=5
qMySQL.SQL.Text ='insert into ... (artikleID, manufacturerName, ...) values (:artid, :mnfname, ...)';

while not qMSSQL.eof do begin
  qMySQL.ParamsByname('artid').Value:=qMSSQL.fieldByName('artid').value;
  ....<и так для каждого поля/параметра>
  qMySQL.ExecSQL;// а теперь ВЫПОЛНИМ (вставим)
  T...MSSQL.Next; // и пойдем дальше
end;
//ВСЕ!!!!

2. все-таки это то самое единственное поле с указанным содержимым ("готовым" запросом на ВСТАВКУ)
Код:

while not qMSSQL.eof do begin
  qMySQL.SQL.Text:=qMSSQL.Fields[0].Asstring; //да там будут и переводы строк (но нам это не интересно без разницы )
  qMySQL.ExecSQL; // надеюсь структура MySQL будет правильной
  qMSSQL.Next;
end;
//ВСЕ!!!!

3. там НЕТ qMSSQL: TadoQuery; а есть исключительно TStringList
можно было бы по аналогии п.2, НО ... переводы строк означают что ОДИН запрос на самом деле записан в НЕСКОЛЬКИХ(и неизвестно скольких) строках.

P.S. вопрос эффективности не рассматривал.
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.07.2018 в 19:12.
evg_m вне форума   Ответить с цитированием
Старый 20.07.2018, 17:08   #3
Adminisrator
Пользователь
 
Регистрация: 19.07.2018
Сообщений: 12
Репутация: 10
По умолчанию

получаю ошибку:
Цитата:
ADOQueryMSSQL: missing SQL property
Сделал всё так:

Код:

procedure RefreshDataSet(DataSet: TDataSet);
begin
  if DataSet.Active then
    DataSet.Refresh
  else
    DataSet.Open;
end;

procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin

  { Set up the connection string. }
  ADOQueryMSSQL.ConnectionString := Format(ConnString, [UserName, PassWord, Server]);
  AdoQueryMySql.ConnectionString := Format(ConnString, [UserName, PassWord, Server]);

  try
    with ADOQueryMSSQL do
       begin
         DisableControls;
         First;

             ADOQueryMSSQL.Open;
             AdoQueryMySql.Open;
                      RefreshDataSet(ADOQueryMSSQL);
             AdoQueryMySQL.SQL.Clear;
             AdoQueryMySQL.SQL.Add('INSERT INTO '+ db +'.'+ db_table +'(`ArtikelID`, `ManufacturerName`,             ');
             AdoQueryMySQL.SQL.Add('`ManufacturerPN`, `Supplier`, `SupplierPN`, `Description`, `PhotoURL`,           ');
             AdoQueryMySQL.SQL.Add('`Price`, `Quantity`, `Currency`, `Lagerplatz`)                                   ');
             AdoQueryMySQL.SQL.Add(' VALUES (:ArtikelID, :ManufacturerName, :ManufacturerPN, :Supplier, :SupplierPN, ');
             AdoQueryMySQL.SQL.Add(' :Description, :PhotoURL, :Price, :Quantity, :Currency, :Lagerplatz)             ');

               while not ADOQueryMSSQL.Eof do begin

                       AdoQueryMySql.Parameters.ParamByName(':ArtikelID').Value       :=ADOQueryMSSQL.FieldByName('ArtikelID').value;
                       AdoQueryMySql.Parameters.ParamByName(':ManufacturerName').Value:=ADOQueryMSSQL.FieldByName('ManufacturerName').value;
                       AdoQueryMySql.Parameters.ParamByName(':ManufacturerPN').Value  :=ADOQueryMSSQL.FieldByName('ManufacturerPN').value;
                       AdoQueryMySql.Parameters.ParamByName(':Supplier').Value        :=ADOQueryMSSQL.FieldByName('Supplier').value;
                       AdoQueryMySql.Parameters.ParamByName(':SupplierPN').Value      :=ADOQueryMSSQL.FieldByName('SupplierPN').value;
                       AdoQueryMySql.Parameters.ParamByName(':Description').Value     :=ADOQueryMSSQL.FieldByName('Description').value;
                       AdoQueryMySql.Parameters.ParamByName(':PhotoURL').Value        :=ADOQueryMSSQL.FieldByName('PhotoURL').value;
                       AdoQueryMySql.Parameters.ParamByName(':Price').Value           :=ADOQueryMSSQL.FieldByName('Price').value;
                       AdoQueryMySql.Parameters.ParamByName(':Quantity').Value        :=ADOQueryMSSQL.FieldByName('Quantity').value;
                       AdoQueryMySql.Parameters.ParamByName(':Currency').Value        :=ADOQueryMSSQL.FieldByName('Currency').value;
                       AdoQueryMySql.Parameters.ParamByName(':Lagerplatz').Value      :=ADOQueryMSSQL.FieldByName('Lagerplatz').value;
                       AdoQueryMySql.ExecSQL;
                       ADOQueryMSSQL.Next;
               end;

       end;


  finally
    RefreshDataSet(ADOQueryMSSQL);
    ADOQueryMSSQL.EnableControls;
    ADOQueryMSSQL.Close;
    AdoQueryMySql.Close;
  end;


end;

Как разрулить?

Последний раз редактировалось Adminisrator; 20.07.2018 в 17:26.
Adminisrator вне форума   Ответить с цитированием
Старый 20.07.2018, 17:52   #4
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,493
Репутация: 5308
По умолчанию

Цитата:
Сообщение от Adminisrator Посмотреть сообщение
Пытаюсь в RAD Studio DX 10.2 считать данные из MSSQL данные
Цитата:
Сообщение от Adminisrator Посмотреть сообщение
Как разрулить?
Цитата:
Сообщение от Adminisrator Посмотреть сообщение
получаю ошибку:
ADOQueryMSSQL: missing SQL property
ну так очевидно же - нужно в ADOQueryMSSQL задать SQL запрос, который будет читать данные из таблицы.
Serge_Bliznykov на форуме   Ответить с цитированием
Старый 20.07.2018, 18:05   #5
Adminisrator
Пользователь
 
Регистрация: 19.07.2018
Сообщений: 12
Репутация: 10
По умолчанию

добавил
Adminisrator вне форума   Ответить с цитированием
Старый 21.07.2018, 14:25   #6
Slym
Профессионал
 
Регистрация: 07.12.2011
Адрес: Siberia
Сообщений: 1,021
Репутация: 759
По умолчанию

сначала
AdoQueryMySQL.SQL.... и только потом AdoQueryMySQL.Open;
__________________
Не стесняемся, плюсуем!
Slym вне форума   Ответить с цитированием
Старый 23.07.2018, 12:08   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,493
Репутация: 5308
По умолчанию

ой.
а вот
Цитата:
Сообщение от Adminisrator Посмотреть сообщение
Код:

AdoQueryMySql.Open

это вообще не нужно!
Serge_Bliznykov на форуме   Ответить с цитированием
Старый 23.07.2018, 15:08   #8
Adminisrator
Пользователь
 
Регистрация: 19.07.2018
Сообщений: 12
Репутация: 10
По умолчанию

теперь вылазит такое после нескольких секунд после нажатия на кнопку:

Цитата:
Parameter object is improperly defined. inconsistent or incomplete information was provided.
структура БД мускла:


Код:

CREATE TABLE IF NOT EXISTS `PartProviderEXT_iMAR` (
  `ArtikelID` int(11) NOT NULL DEFAULT '0',
  `ManufacturerName` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `ManufacturerPN` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `Supplier` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'iMAR GmbH',
  `SupplierPN` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `Description` varchar(10000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `PhotoURL` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT '',
  `Price` float DEFAULT '0',
  `Quantity` int(11) DEFAULT '0',
  `Currency` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'EUR',
  `Lagerplatz` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Мой код Delphi:

Код:

procedure RefreshDataSet(DataSet: TDataSet);
begin
  if DataSet.Active then
    DataSet.Refresh
  else
    DataSet.Open;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin

  { Set up the connection string. }
  ADOQueryMSSQL.ConnectionString := Format(MSSQLConnString, [UserName, PassWord, MSSQLServer]);
  AdoQueryMySql.ConnectionString := Format(ConnString, [UserName, PassWord, Server]);

  try
    with ADOQueryMSSQL do
       begin
         DisableControls;
         RefreshDataSet(ADOQueryMSSQL);
         First;

             ADOQueryMSSQL.Open;
             AdoQueryMySQL.SQL.Clear;
             AdoQueryMySQL.SQL.Add('INSERT INTO '+ db +'.'+ dbtable +'(`ArtikelID`, `ManufacturerName`,             ');
             AdoQueryMySQL.SQL.Add('`ManufacturerPN`, `Supplier`, `SupplierPN`, `Description`, `PhotoURL`,           ');
             AdoQueryMySQL.SQL.Add('`Price`, `Quantity`, `Currency`, `Lagerplatz`)                                   ');
             AdoQueryMySQL.SQL.Add(' VALUES (:ArtikelID, :ManufacturerName, :ManufacturerPN, :Supplier, :SupplierPN, ');
             AdoQueryMySQL.SQL.Add(' :Description, :PhotoURL, :Price, :Quantity, :Currency, :Lagerplatz)             ');
             AdoQueryMySql.Open;
               while not ADOQueryMSSQL.Eof do begin
                       AdoQueryMySql.Parameters.ParamByName(':ArtikelID').Value       :='1';
                       AdoQueryMySql.Parameters.ParamByName(':ManufacturerName').Value:='2';
                       AdoQueryMySql.Parameters.ParamByName(':ManufacturerPN').Value  :='3';
                       AdoQueryMySql.Parameters.ParamByName(':Supplier').Value        :='4';
                       AdoQueryMySql.Parameters.ParamByName(':SupplierPN').Value      :='5';
                       AdoQueryMySql.Parameters.ParamByName(':Description').Value     :='6';
                       AdoQueryMySql.Parameters.ParamByName(':PhotoURL').Value        :='-';
                       AdoQueryMySql.Parameters.ParamByName(':Price').Value           :='8';
                       AdoQueryMySql.Parameters.ParamByName(':Quantity').Value        :='9';
                       AdoQueryMySql.Parameters.ParamByName(':Currency').Value        :='EUR';
                       AdoQueryMySql.Parameters.ParamByName(':Lagerplatz').Value      :='11';
                       AdoQueryMySql.ExecSQL;
                       ADOQueryMSSQL.Next;
               end;
       end;

  finally
    RefreshDataSet(ADOQueryMSSQL);
    ADOQueryMSSQL.EnableControls;
    ADOQueryMSSQL.Close;
    AdoQueryMySql.Close;
  end;

end;

Не пойму в чём проблема. С отладкой тоже не пойму...

Последний раз редактировалось Adminisrator; 23.07.2018 в 15:11.
Adminisrator вне форума   Ответить с цитированием
Старый 23.07.2018, 15:23   #9
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,994
Репутация: 6304
По умолчанию

Несколько полей числовых. Строковые значения в параметры для них зачем?
Цитата:
First;

ADOQueryMSSQL.Open;
Ни к селу, ни к городу ))
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.07.2018 в 15:25.
Аватар на форуме   Ответить с цитированием
Старый 23.07.2018, 15:29   #10
Adminisrator
Пользователь
 
Регистрация: 19.07.2018
Сообщений: 12
Репутация: 10
По умолчанию

Согласен. Удалил.
Цитата:
ADOQueryMSSQL.Open;

Цитата:
Строковые значения в параметры для них зачем?
Не совсем понял вопрос.
Adminisrator вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
слишком много аргументов в вызове функции или как создать много файлов на рабочем столе ON Mikhail Общие вопросы C/C++ 1 07.03.2018 22:02
Много раз дублирует вывод данных TurboDiesel Microsoft Office Access 6 12.11.2014 16:57
Одна команды-много данных на mmx y0rker Assembler 0 25.06.2012 16:48
Почему так много структур данных? ilia.sk8 Помощь студентам 1 28.01.2011 20:03


14:55.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru