powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отправить много данных в MySQL одним потоком
49 сообщений из 49, показаны все 2 страниц
Отправить много данных в MySQL одним потоком
    #39676183
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь в RAD Studio DX 10.2 считать данные из MSSQL данные и синхронизировать либо просто перекинуть в MySQL.
Данных около 50.000 записей (примерно7Мб). Использую TADOQuery и TADOConnection.
К обеим БД успешно подключился и из MSSQL получаю данные.
Из MSSQL имею либо многострочный файл на диске, либо TStringList наполненый данными.
Каждая строка файла - это одна запись данных,
либо
Каждая строка в TStringList'е - это одна запись данных.
Данные выглядят так:
Код: pascal
1.
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 порциями.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676194
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user00001,

задача решается без привлечения Delphi. Иди в профильный (MS SQL) форум.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676195
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__задача решается без привлечения Delphi. Иди в профильный (MS SQL) форум.
В гугле SSIS. При чем работает достаточно шустро со свистоперделками, салютами и застольями.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676206
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже делал с помощью PowerShell и перегонял в Firebase,
но теперь концепция поменялась и при вытаскивании данных из MSSQL выполняется много хитрых запросов, чтобы получить в конечном итоге из сотен таблиц именно то что надо получить.
SSIS уже попробовал, но у него трудности с MySQL и как написал выше перед тем надо выполнить ещё кучу запросов.
Кроме того струкстура выглядит так:
Сервер1 - MSSQL
Сервер2 - мой написаный на Delphi сервис
Сервер3 - MySQL

Сервер1 и Сервер3 между собой не ладят, но Сервер2 имеет полный доступ на оба.

Сервис я уже сделал и извлекаю все данные, но осталось лишь отправить в мускл.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676207
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
while not SrcQuery.Eof do
  DestQuery.Params[..].Value := ScrQuery.Fields[..].Value
  ...
  DestQuery.Exec;
  SrcQuery.Next
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676209
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда можно загнать одним скриптом:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676219
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Код: pascal
1.
2.
3.
4.
5.
while not SrcQuery.Eof do
  DestQuery.Params[..].Value := ScrQuery.Fields[..].Value
  ...
  DestQuery.Exec;
  SrcQuery.Next



Примерно так я и сам понимаю, тоже гуглил :)

Представьте, у меня есть заполненый TStringList,
но что надо вписать в качестве DestQuery.Params[..].Value и ScrQuery.Fields[..].Value ?
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676225
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТогда можно загнать одним скриптом:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Данные я действительно из MSSQL тоже могу сохранить в файл (как уже выше писал). Естати файл так и выглядит, как вы сейчас прислали, только таких 50.000 строк.
Но вот мои хотелки:
1. я хочу избежать потерь времени при записи в файл. Это просто ненужная операция.
2. хочу избежать промежуточных действий типа дополнительный скрипт или крон процесс для иморта сохранёного файла в MySQL.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676232
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Код: pascal
1.
2.
3.
4.
5.
while not SrcQuery.Eof do
  DestQuery.Params[..].Value := ScrQuery.Fields[..].Value
  ...
  DestQuery.Exec;
  SrcQuery.Next



Кстати это легко вызовет
Код: html
1.
ERROR 1040 (08004): Too many connections



Так как 50.000 записей!
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676248
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001
Код: html
1.
Too many connections


Так как 50.000 записей !не вижу связи
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676255
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторwhile not SrcQuery.Eof do

Это проход по всем записям и мускл не успевает обрабатывать их принятие.


Мои вопросы остались не отвечеными.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676267
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Естати файл так и выглядит, как вы сейчас прислали, только таких 50.000 строк.
Не совсем. В моем примере мускульный вариант вставки сразу трех строк, а не одной. Можно и 100 строк одним махом вставить.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676270
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

ну, в моём 50.000 инсёртов.

Проблема остаётся открытой...
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676290
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй группировать инсёрты трансакциями. Например по тысяче за транзакцию. Глядишь, немного ускорится.

Ну и как wadman предлагал одним скриптом по тысяче записей тоже нормальная альтернатива транзакции.
Причём 1000 - это условное число - им можно поиграться в сторону уменьшения / увеличения.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676294
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001ну, в моём 50.000 инсёртов.
Проблема остаётся открытой...1. Прочитали запись
2. Заполнили параметры запроса
Код: sql
1.
2.
3.
4.
5.
INSERT INTO `database`.`db_table`(
  `ArtikelID`, `ManufacturerName`, `ManufacturerPN`, `Supplier`, `SupplierPN`, `Description`, `PhotoURL`, `Price`, `Quantity`, `Currency`, `Lagerplatz`
) VALUES (
  :ArtikelID, :ManufacturerName, :ManufacturerPN, :Supplier, :SupplierPN, :Description, :PhotoURL, :Price, :Quantity, :Currency, :Lagerplatz
)


3. Выполнили запрос
4. Перешли к следующей записи MSSQL
5. GOTO 1
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676295
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanНе совсем. В моем примере мускульный вариант вставки сразу трех строк, а не одной. Можно и 100 строк одним махом вставить. Мне тут один бэкап попался Postgresql, так там оказывается в порядке вещей в SQL после INSERT CSV фигачить. За один INSERT можно легко сотню-другую тысяч записей вставить. Буквально за секунду. :D
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676309
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята,

в следствии моего незнания "как надо правильно",
я сделал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
var
  ADOConn  : TADOConnection;
  ADOQuery : TADOQuery;
  DataSrc  : TDataSource;
  Param    : TParameter;
  SQLStr  : string;
  MyStream: TStream;

var tString,File2Use:string;
    count,i:integer;
    SuperQuery:TStringList;

begin

  with AdoQuery1 do
    begin
      SuperQuery := TStringList.Create;
     // MyStream:= TStream.Create;  
      DisableControls;
      First;

      while not (Eof) do begin  // читаю всё записи

      { SQL Query }    // создаю записи запросов  /// примерно 50.000 таких строк
      SuperQuery.Append('INSERT INTO `database`.`db_table`(`ArtikelID`,'+
            ' `ManufacturerName`, `ManufacturerPN`, `Supplier`, `SupplierPN`,'+
            ' `Description`, `PhotoURL`, `Price`, `Quantity`, `Currency`, `Lagerplatz`) VALUES'+
            ' ('''+''+trim(Fields.Fields[0].AsString)+
            ''', '''+trim(Fields.Fields[1].AsString)+
            ''', '''+trim(Fields.Fields[2].AsString)+
            ''', ''Firma'', '''+
                 trim(Fields.Fields[3].AsString)+
            ''', '''+trim(Fields.Fields[4].AsString)+
            ''', ''-'', '''+trim(Fields.Fields[5].AsString)+
            ''', '''+trim(Fields.Fields[6].AsString)+
            ''', ''EUR'', '''+trim(Fields.Fields[7].AsString)+''');');


         //SuperQuery.SaveToStream(MyStream);   // попытался через стрим
         //Memo1.Text:=SuperQuery.Text;

        Next;
      end;


  { Create an ADO connection. }
  ADOConn := TADOConnection.Create(Self);
  { Set up the provider engine }

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

  { Disable login prompt. }
  ADOConn.LoginPrompt := False;

  try
    ADOConn.Connected := True;
  except
    on e: EADOError do
    begin
      MessageDlg('Error while connecting', mtError,
                  [mbOK], 0);

      Exit;
    end;
  end;

  { Create the query. }
  ADOQuery := TADOQuery.Create(Self);
  ADOQuery.Connection := ADOConn;
////  ADOQuery.SQL.LoadFromStream(MyStream);  // в этом варианте делаю что-то не так
//  ADOQuery.SQL.LoadFromFile('file.txt');   // этот вариант у меня не работает




  { Set the query to Prepared--it will improve performance. }
  ADOQuery.Prepared := true;

  try
  ADOQuery.ExecSQL;
//  SuperQuery.SaveToFile('file.txt');    // так могу сохранить в файл
//  ADOConn.Execute(SuperQuery.Text);  // так попытался закинуть все записи из TStringList
    ADOQuery.Active := True;
  except
    on e: EADOError do
    begin
      MessageDlg('Error while doing query', mtError,
                  [mbOK], 0);

      Exit;
    end;
  end;

end;



В приведеном исходнике вы можите видеть моё колдовство:
через ADOQuery.ExecSQL;
и через ADOConn.Execute();

Вот я дошёл до этого бреда и защёл в ступор. Не могу это разрулить.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676320
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете видеть, как я сделал не очень хороший цикл и создаю убогим методом запрос-строку...
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676325
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Можете видеть, как я сделал не очень хороший цикл и создаю убогим методом запрос-строку...

какую строку?
вижу какой-то SuperQuery
который нигде не используется
что ты хочешь то?
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676326
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используется, я просто закомментировал
Код: pascal
1.
ADOConn.Execute(SuperQuery.Text); 
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676329
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
через ADOQuery.ExecSQL;
и через ADOConn.Execute();



Смотрите на закомментированные строки слэшами //, это были мои варианты
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676333
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, чтобы не разбираться в моём бреде, напишите свой вариант, потому что я точно что-то напутал
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676337
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 SuperQuery.Append('INSERT INTO `database`.`db_table`(`ArtikelID`,'+
            ' `ManufacturerName`, `ManufacturerPN`, `Supplier`, `SupplierPN`,'+
            ' `Description`, `PhotoURL`, `Price`, `Quantity`, `Currency`, `Lagerplatz`) VALUES'+
            ' ('''+''+trim(Fields.Fields[0].AsString)+
            ''', '''+trim(Fields.Fields[1].AsString)+
            ''', '''+trim(Fields.Fields[2].AsString)+
            ''', ''Firma'', '''+
                 trim(Fields.Fields[3].AsString)+
            ''', '''+trim(Fields.Fields[4].AsString)+
            ''', ''-'', '''+trim(Fields.Fields[5].AsString)+
            ''', '''+trim(Fields.Fields[6].AsString)+
            ''', ''EUR'', '''+trim(Fields.Fields[7].AsString)+''');');

Я же сказал и даже выделил
_Vasilisk_2. Заполнили параметры запросаНе сформировали заново SQL а заполнили параметры
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676341
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
AdoQueryMySQL.SQL.Text := 'INSERT INTO `database`.`db_table`(`ArtikelID`, `ManufacturerName`, `ManufacturerPN`,'+
              '`Supplier`, `SupplierPN`, `Description`, `PhotoURL`, `Price`, `Quantity`, `Currency`, Lagerplatz`)'+
              'VALUES (:ArtikelID, :ManufacturerName, :ManufacturerPN, :Supplier, :SupplierPN, :Description, '+
              ':PhotoURL, :Price, :Quantity, :Currency, :Lagerplatz)';
AdoQueryMSSql.Open;
while not AdoQueryMSSql.Eof do
begin
  for i := 0 to AdoQueryMSSql.FieldCount - 1 do
    AdoQueryMySql.Parameters[i].Value := AdoQueryMSSql.Fields[i].AsVariant;
  AdoQueryMySql.ExecSQL;
  AdoQueryMSSql.Next;
end;



Все. Если заменить оба ADOQuery на ADOCommand будет быстрее
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676372
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я не так делаю.
То что вы дали я встроил вместо того запроса и теперь ничего в программе не выполняется и возвращается
"Argument out of range"
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676375
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001и возвращается
"Argument out of range"Строку кода мы должны угадать?
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676379
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_user00001и возвращается
"Argument out of range"Строку кода мы должны угадать?

у него там еще еуро и фирма в коде
в общем надо программиста тут
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676394
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
строку не видно, но при отладке пошагово
при выполнении строки
Код: pascal
1.
AdoQueryMySql.ExecSQL;



После моего Unit1 переходит на метод
Код: pascal
1.
TIntegerField.GetAsVariant: Variant;


строка 6494
Код: pascal
1.
  if GetValue(L) then Result := L else Result := Null;


файла Data.DB.pas

затем выпадает на методе
Код: pascal
1.
  TListHelper.CheckItemRange(AIndex: Integer);


строка 1158
Код: pascal
1.
 CheckItemRangeInline(AIndex);


файла System.Generics.Collections.pas
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676427
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
    AdoQueryMySql.Parameters[i].Value := AdoQueryMSSql.Fields[i].AsVariant;


Поправка (сам наткнулся на эти грабли, а вот сейчас забыл). Безопаснее TParam.AssignField. А то типы могут потеряться, с null м.б. проблема и т.п.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676431
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001при выполнении строки
Код: pascal
1.
AdoQueryMySql.ExecSQL;


После моего Unit1 переходит на метод
Код: pascal
1.
TIntegerField.GetAsVariant: Variant;

В моем коде такого быть не может.

Выкладывайте тот код, какой вы запускаете
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676443
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin

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

  try
    with AdoQuery1 do
       begin
         DisableControls;
         First;

             AdoQueryMySQL.SQL.Text := 'INSERT INTO `db`.`db_table`(`ArtikelID`, `ManufacturerName`, '+
                                       '`ManufacturerPN`, `Supplier`, `SupplierPN`, `Description`, `PhotoURL`,'+
                                       '`Price`, `Quantity`, `Currency`, Lagerplatz`) VALUES '+
                                       '(:ArtikelID, :ManufacturerName, :ManufacturerPN, :Supplier, :SupplierPN,'+
                                       ' :Description, :PhotoURL, :Price, :Quantity, :Currency, :Lagerplatz)';
             AdoQuery1.Open;
               while not AdoQuery1.Eof do begin
                  for i := 0 to AdoQuery1.FieldCount - 1 do
                       AdoQueryMySql.Parameters[i].Value := AdoQuery1.Fields[i].AsVariant;
                       AdoQueryMySql.ExecSQL;
                       AdoQuery1.Next;
               end;

       end;

  finally
    AdoQuery1.EnableControls;
    AdoQuery1.Close;
  end;

end;

...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676586
ain-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Лазарусе. MySQL. Рабочий пример. Массовая запись в базу.
Если количество записей превышает возможности, проверка в цикле и запись порциями.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    DM.qTmp1.SQL.BeginUpdate;
    while Assigned(P) do begin
      Data := vsBuyNakl.GetNodeData(P);
      S := Format('(%d, "%s", %s, %d, %d, %d, %d, %d, %d, "%d"),',
          [UN, DateToStrMySQL(FDateBuy), FNakl, Data^.UNP, Ord(Data^.Firm), Data^.Article, Data^.CountBuy, Ord(Data^.Is_Promo), boBuy,  Data^.Retail]);
      DM.qTmp1.SQL.Add(S);
      P := P^.NextSibling;
    end;
    DM.qTmp1.SQL.EndUpdate;
    if vsBuyNakl.RootNode^.ChildCount > 0 then begin
      MakeEndInsert(DM.qTmp1.SQL); // Убрать последнюю запятую
      DM.qTmp1.ExecSQL;
    end;
...
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676592
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ain-2,

S := Format('(%d, "%s", %s, %d, %d, %d, %d, %d, %d, "%d"),',
[UN, DateToStrMySQL(FDateBuy), FNakl, Data^.UNP, Ord(Data^.Firm), Data^.Article, Data^.CountBuy, Ord(Data^.Is_Promo), boBuy, Data^.Retail]);

небезопасно в общем случае
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676611
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ain-2,

как этот код вписывается в мой вопрос?

Что эти строки означают?

Прокомментируйте пожалуйста, как мне это применить/встроить при описаной проблеме.

Код: pascal
1.
2.
3.
4.
5.
DM.qTmp1.
    P
    vsBuyNakl.GetNodeData(P);
    P := P^.NextSibling;
    if vsBuyNakl.RootNode^.ChildCount > 0 then begin
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676621
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Пытаюсь в RAD Studio DX 10.2 считать данные из MSSQL данные и синхронизировать либо просто перекинуть в MySQL.
Данных около 50.000 записей (примерно7Мб). Использую TADOQuery и TADOConnection.
Качаете ODBC драйвер MySQL под свою архитектуру;

Делаете linked server MSSQL->MySQL;

На стороне MSSQL обрабатываете N+1 записей;

Из них получаете 50000 готовых записей и одним Insert отправляете на linked server MySQL.

Что такого с данными делается в Delphi, чего нельзя сделать в MSSQL? Если сводятся данные из нескольких источников, то проще, действительно, через SSIS. Зачем лишняя прокладка на Delphi, если, вероятно, можно обойтись в рамках одного только sql?
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676900
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknown,

user00001Уже делал с помощью PowerShell и перегонял в Firebase,
но теперь концепция поменялась и при вытаскивании данных из MSSQL выполняется много хитрых запросов, чтобы получить в конечном итоге из сотен таблиц именно то что надо получить.
SSIS уже попробовал, но у него трудности с MySQL и как написал выше перед тем надо выполнить ещё кучу запросов.
Кроме того струкстура выглядит так:
Сервер1 - MSSQL
Сервер2 - мой написаный на Delphi сервис
Сервер3 - MySQL

Сервер1 и Сервер3 между собой не ладят, но Сервер2 имеет полный доступ на оба.

Сервис я уже сделал и извлекаю все данные, но осталось лишь отправить в мускл.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39676971
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Пытаюсь в RAD Studio DX 10.2 считать данные из MSSQL данные и синхронизировать либо просто перекинуть в MySQL.
Данных около 50.000 записей (примерно7Мб). Использую TADOQuery и TADOConnection.
К обеим БД успешно подключился и из MSSQL получаю данные.
Из MSSQL имею либо многострочный файл на диске, либо TStringList наполненый данными.
Каждая строка файла - это одна запись данных,
либо
Каждая строка в TStringList'е - это одна запись данных.
Данные выглядят так:
Код: pascal
1.
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 порциями.
Если использовать, например, UnIDAC, то такая задача легко решается через Batch Updates (у них об этом даже статейка есть со сравнением скорости вставки https://blog.devart.com/using-batch-operations-in-delphi-data-access-components.html )
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677012
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0rk,

UnIDAC - платные.
Без них тоже легко решается, но я неправильно записываю код и потому прошу помощи.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677013
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, народ, неужели так сложно?!

Уже засран весь топик, а результата всё нет...
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677032
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Показывай код, что не получается.
И на каких данных. И на каком поле.
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677034
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Блин, народ, неужели так сложно?!

Уже засран весь топик, а результата всё нет...

так программиста ж не зовешь...
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677037
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677189
ain-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001ain-2,

как этот код вписывается в мой вопрос?

Что эти строки означают?

Прокомментируйте пожалуйста, как мне это применить/встроить при описаной проблеме.

Код: pascal
1.
2.
3.
4.
5.
DM.qTmp1.
    P
    vsBuyNakl.GetNodeData(P);
    P := P^.NextSibling;
    if vsBuyNakl.RootNode^.ChildCount > 0 then begin


Я показал суть.
В цикле заполняем список нужными данными.
Затем отправляем весь список в базу.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
    while Assigned(P) do begin
      Data := vsBuyNakl.GetNodeData(P);
      S := Format('(%d, "%s", %s, %d, %d, %d, %d, %d, %d, "%d"),',
          [UN, DateToStrMySQL(FDateBuy), FNakl, Data^.UNP, Ord(Data^.Firm), Data^.Article, Data^.CountBuy, Ord(Data^.Is_Promo), boBuy,  Data^.Retail]);
      DM.qTmp1.SQL.Add(S);
      P := P^.NextSibling;
    end;


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

Я не показал первую строку списка, полагал, что и так ясно.
Код: pascal
1.
    S := Format('INSERT INTO %s ', [CListBase[Param.Base]]) + '(Un, DateOp, Nakl, UNP, Firm, Article, CountBuy, Promo, Oper, Retail) VALUES ';
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677319
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Поле "Description" имеет тип "текст" и содержит в себе текст (включая преносы строк).
попробуй использовать параметры в запросе
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677465
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Из MSSQL имею либо многострочный файл на дискеСамый быстрый способ заполнить таблицу из файла - LOAD DATA INFILE
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677466
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677720
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftuser00001Из MSSQL имею либо многострочный файл на дискеСамый быстрый способ заполнить таблицу из файла - LOAD DATA INFILE

Это и так понятно, но как содержимое файла отправить из под моего Delphi написаной программы в мускл (к примеру через LOAD DATA INFILE) ?
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677773
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user00001Это и так понятно, но как содержимое файла отправить из под моего Delphi написаной программы в мускл (к примеру через LOAD DATA INFILE) ?Нанять программиста. Серьезно.
PS: В справке всё написано
...
Рейтинг: 0 / 0
Отправить много данных в MySQL одним потоком
    #39677830
user00001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

ну ты красава! Серьёзно!

Не cмог строку написать

Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.Button1Click(Sender: TObject);
begin
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('LOAD DATA INFILE ''c:\\file.csv'' INTO TABLE test.file character set latin1 FIELDS TERMINATED BY '','' ENCLOSED BY ''"''LINES TERMINATED BY ''\r\n''ignore 1 lines;');
    SQLQuery1.ExecSQL(true);
end;



зато ты негр, меня как негра, на панель посылаешь!

Не хорошо поступаешь!

Я уже сам всё сделал, как видно.
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отправить много данных в MySQL одним потоком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]