Показать сообщение отдельно
  #2  
Старый 20.01.2026, 16:18
depotop depotop вне форума
Прохожий
 
Регистрация: 20.01.2026
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Для реализации этой задачи в Delphi 7 или более современных версиях наиболее эффективным способом будет работа на уровне объектов DataSet. Поскольку данные в DBGrid уже отображаются, это означает, что оба набора данных (ADOQuery для CSV и FDQuery для БД) открыты и готовы к чтению/записи.
Наиболее простой и понятный алгоритм — это цикл по исходному набору данных (CSV), внутри которого для каждой строки выполняется команда добавления в целевой набор данных (БД).


Код:
 procedure TForm1.btnImportClick(Sender: TObject);
begin
  // Отключаем визуальное обновление DBGrid для ускорения процесса
  FDQuery1.DisableControls;
  ADOQuery1.DisableControls;
  try
    // Переходим в начало CSV-файла
    ADOQuery1.First;
    
    while not ADOQuery1.Eof do
    begin
      // Переводим целевую таблицу в режим добавления записи
      FDQuery1.Append;
      
      // Копируем данные по именам полей
      // Замените 'FieldName' на реальные названия ваших колонок
      FDQuery1.FieldByName('TargetColumn1').Value := ADOQuery1.FieldByName('SourceColumn1').Value;
      FDQuery1.FieldByName('TargetColumn2').Value := ADOQuery1.FieldByName('SourceColumn2').Value;
      FDQuery1.FieldByName('TargetColumn3').Value := ADOQuery1.FieldByName('SourceColumn3').Value;
      
      // Сохраняем запись в БД
      FDQuery1.Post;
      
      // Переходим к следующей строке в CSV
      ADOQuery1.Next;
    end;
    
    ShowMessage('Данные успешно импортированы!');
  finally
    // Включаем обновление интерфейса обратно
    ADOQuery1.EnableControls;
    FDQuery1.EnableControls;
  end;
 end;
Админ: Пользуемся тегами при оформлении кода!


Если данных в CSV очень много (десятки тысяч строк), использование метода Append/Post может быть медленным, так как каждый Post отправляет отдельный запрос к серверу. В таком случае для FDQuery (FireDAC) лучше использовать механизм Batch Move или сформировать один SQL-запрос типа INSERT INTO ... SELECT, но работа через циклы DataSet является самой гибкой, так как позволяет легко добавить проверки данных или трансформацию типов «на лету».

Убедитесь, что свойства ReadOnly у целевого FDQuery и его DataSource установлены в False, иначе метод Append вызовет ошибку доступа.
Ответить с цитированием