Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Добавление записи через класс  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 142
Подскажите как правильно делают в такой ситуации.
Есть КласА, в КласеА есть метод добавления записи в базу insert_record, insert_record "дергает" клас для работы с базой, и выполняет метод InsertRecordBase в котором создается транзакция, query, формируеться текст insert into... подставляет переданные значение для вставки и запись добавляется в базу. Для одиночной вставки вопросов нет.
А если допустим необходимо вставить несколько записей через цикл (for I := 0 to 10 do).
Как поступают в такой ситуации?

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

КласА.create;
for I := 0 to 10 do 
КласА.field1:=variable1
КласА.field2:=variable2
КласА.field3:=variable3
КласА.insert_record;
В таком варианте insert_record при каждом добавлении записи (шаге в цикле) будет обращаться к InsertRecordBase которая в свою очередь будет создавать компоненты и в конце разрушать.
Мне кажеться (перекрестился) ересью такое решение.
6 дек 18, 20:15    [21756349]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
Sashaua,

сразу создавай класс для вставки большого количества. А одна запись - лишь частный случай.
6 дек 18, 20:19    [21756354]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10638
1. Компоненты создаются в конструкторе класса, уничтожаются деструкторе
2. Компоненты создаются при первом обращении, уничтожаются деструкторе
3. Компоненты создаются и уничтожаются в специальных методах, которые вызываются перед первой вставкой и после последней
LObj.InitDB;
try
  for ... do begin
    .........
    LObj.InsertRecord;
  end;
finally
  LObj.DeinitDB;
end;
6 дек 18, 20:49    [21756388]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59449
Sashaua
А если допустим необходимо вставить несколько записей через цикл (for I := 0 to 10 do).
Мне кажеться (перекрестился) ересью такое решение.
C идеологической т.з. - да, ересь, неправильно. Но пока это именно несколько (10-100)
записей - можешь не париться, а вот если их понадобится много (>1000) записей - надо
будет думать и дописывать/добавлять классы.
6 дек 18, 21:52    [21756447]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Beltar
Member

Откуда:
Сообщений: 143
А что мешает просто сгенерировать все SQL-запросы, а потом отдать их компоненту работы с БД, уж не знаю, что там у вас, TFDQuery, TADOQuery,...?

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

for i:=1 to BigNumber do
  begin
  InsertRecord;
  end;


и

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


Колоссальная. В одном моем случае, когда я по незнанию сделал построчную вставку было около 210 сек на ЕМНИП под 100к запросов, и всего 7 сек, когда я сделал группировку по 10к запросов за Query.Exec.
7 дек 18, 10:41    [21756740]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59449
Beltar> А что мешает просто сгенерировать все SQL-запросы,
Beltar> а потом отдать их компоненту работы с БД

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

Повторю, если речь не о каких-то импортах и mass-insert-ах,
то можно не париться. Ну или если "неаккуратненько", то
сделать/добавить функционал, который на вход принимает
массив(ы) и выполняет их одним скопом - в одной транзакции,
одним запросом (prepare+цикл execute) и т.д.

Posted via ActualForum NNTP Server 1.5

7 дек 18, 13:09    [21756954]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 142
Гаджимурадов Рустам,

Хочется акуратненько, можете поделится примером реализации, кучу инфы в нете пересмотрел а в голову ничего не приходит .
7 дек 18, 14:43    [21757105]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59449
Sashaua> можете поделится примером реализации

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

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

Если нужно будет ещё более эффективненько, то можно
внутри проводить это не построчно, а через ArrayDML -
снаружи ничего не изменится. Но это требуется только
при серьёзных объёмах вставок, а не пара десятков.

Posted via ActualForum NNTP Server 1.5

7 дек 18, 16:41    [21757310]     Ответить | Цитировать Сообщить модератору
 Re: Добавление записи через класс  [new]
Василий 2
Member

Откуда:
Сообщений: 303
Зависит от того, насколько можно расширять класс. Я бы посоветовал добавить либо непосредственно методы StartTransaction/Commit/Rollback (соответствует слою БД), либо Begin/EndUpdate (в стиле RTL)
7 дек 18, 17:23    [21757387]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить