powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление записи через класс
9 сообщений из 9, страница 1 из 1
Добавление записи через класс
    #39743839
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как правильно делают в такой ситуации.
Есть КласА, в КласеА есть метод добавления записи в базу insert_record, insert_record "дергает" клас для работы с базой, и выполняет метод InsertRecordBase в котором создается транзакция, query, формируеться текст insert into... подставляет переданные значение для вставки и запись добавляется в базу. Для одиночной вставки вопросов нет.
А если допустим необходимо вставить несколько записей через цикл (for I := 0 to 10 do).
Как поступают в такой ситуации?

В доставшемся коде я нашел примерно такую реализацию.

Код: pascal
1.
2.
3.
4.
5.
6.
КласА.create;
for I := 0 to 10 do 
КласА.field1:=variable1
КласА.field2:=variable2
КласА.field3:=variable3
КласА.insert_record;

В таком варианте insert_record при каждом добавлении записи (шаге в цикле) будет обращаться к InsertRecordBase которая в свою очередь будет создавать компоненты и в конце разрушать.
Мне кажеться (перекрестился) ересью такое решение.
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39743843
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

сразу создавай класс для вставки большого количества. А одна запись - лишь частный случай.
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39743865
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Компоненты создаются в конструкторе класса, уничтожаются деструкторе
2. Компоненты создаются при первом обращении, уничтожаются деструкторе
3. Компоненты создаются и уничтожаются в специальных методах, которые вызываются перед первой вставкой и после последней
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
LObj.InitDB;
try
  for ... do begin
    .........
    LObj.InsertRecord;
  end;
finally
  LObj.DeinitDB;
end;
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39743896
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashauaА если допустим необходимо вставить несколько записей через цикл (for I := 0 to 10 do).
Мне кажеться (перекрестился) ересью такое решение.C идеологической т.з. - да, ересь, неправильно. Но пока это именно несколько (10-100)
записей - можешь не париться, а вот если их понадобится много (>1000) записей - надо
будет думать и дописывать/добавлять классы.
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39744071
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает просто сгенерировать все SQL-запросы, а потом отдать их компоненту работы с БД, уж не знаю, что там у вас, TFDQuery, TADOQuery,...?

И да, разница в скорости между

Код: pascal
1.
2.
3.
4.
for i:=1 to BigNumber do
  begin
  InsertRecord;
  end;



и

Код: pascal
1.
2.
3.
4.
5.
for i:=1 to BigNumber do
  begin
  Query.SQL.Add(GenerateSQLString);
  end;
Query.Exec;//Или как-там этот метод называется, я, обычно, через свой враппер вызываю.



Колоссальная. В одном моем случае, когда я по незнанию сделал построчную вставку было около 210 сек на ЕМНИП под 100к запросов, и всего 7 сек, когда я сделал группировку по 10к запросов за Query.Exec.
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39744229
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar> А что мешает просто сгенерировать все SQL-запросы,
Beltar> а потом отдать их компоненту работы с БД

Структура классов. Которая уже есть и игнорировать
которую будет ещё более идеологически неправильно.

Повторю, если речь не о каких-то импортах и mass-insert-ах,
то можно не париться. Ну или если "неаккуратненько", то
сделать/добавить функционал, который на вход принимает
массив(ы) и выполняет их одним скопом - в одной транзакции,
одним запросом (prepare+цикл execute) и т.д.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39744317
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Хочется акуратненько, можете поделится примером реализации, кучу инфы в нете пересмотрел а в голову ничего не приходит .
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39744443
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua> можете поделится примером реализации

Примером чего именно? У вас же уже есть струкура классов.
Грубо говоря либо добавить в ваш TDBClass перекрытый
(или новый - непринципиально) метод InsertRecordBase
c параметрами data : List/array of TBusinessClass, а снаружи
соответственно создавать и передавать этот массив/список.

Это если аккуратненько. Если менее ааккуратненько и более
удобненько и эффективненько - то же самое, но параметр
будет data : array of ParamValues без экземпляров класса.

Если нужно будет ещё более эффективненько, то можно
внутри проводить это не построчно, а через ArrayDML -
снаружи ничего не изменится. Но это требуется только
при серьёзных объёмах вставок, а не пара десятков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление записи через класс
    #39744482
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от того, насколько можно расширять класс. Я бы посоветовал добавить либо непосредственно методы StartTransaction/Commit/Rollback (соответствует слою БД), либо Begin/EndUpdate (в стиле RTL)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление записи через класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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