![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, подскажите пожалуйста как реализовать такое:
на форме два dbgrid,один отображает данные одного dataset через FDQuery, другой dbgrid отображает данные другого dataset через ADOQury который смотрит на CSV файл. Нажимая кнопку все данные столбцов из CSV должны добавится в столбцы таблицы базы данных. Не понимаю с чем работать либо с DataSetами,либо как то еще.....Если не сложно то помогите кодом?? |
|
#2
|
|||
|
|||
|
Для реализации этой задачи в 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 вызовет ошибку доступа. Последний раз редактировалось Admin, 25.01.2026 в 11:55. |
| Этот пользователь сказал Спасибо depotop за это полезное сообщение: | ||
ngur (21.01.2026)
| ||
|
#3
|
|||
|
|||
|
Спасибо большое что помогли
|