Для реализации этой задачи в 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 вызовет ошибку доступа.