powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отправить много данных в MySQL одним потоком
24 сообщений из 49, страница 2 из 2
Отправить много данных в 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
24 сообщений из 49, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отправить много данных в MySQL одним потоком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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