Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вставка записи при уникальном индексе. [Access]


Страницы:   1 2

Ш-К ©   (2007-03-05 02:51:00) 

Вставляю из Delphi около 1000 записей. Таблица имеет уникальный индекс по 2 полям.
Что сделать, чтоб не ругался при вставке неуникальной записи, а просто игнорировал вставку?


ЮЮ   (2007-03-05 08:52:00) [21]

> движок аксесс это COM обьект

Полагаю, что речь здесь все-таки не об Access, а о mdb-файлах. На файл-сервере может и не оказаться никакого Access


sniknik   (2007-03-05 08:47:00) [22]

ЮЮ ©   (05.03.07 08:27) [6]
> Для увеличения скорости, избежания вставки дубликатов и прочая
+
в промежуточную таблицу тоже заливать пакетом, из текстового файла/дбф-а и т.д. смотря откуда эти данные берутся (в AFormList они откуда?). иногда даже сформировать текстовый файл а после залить одной командой будет быстрее чем позаписьно...

но вообще надо смотреть на то сколько дублей, если один два на тысячу то такие "предварительные ласки" ничего не ускорят, смысл имеет если их много, ну половина хотябы... а то и наоборот на тысячу только одна две новые... вот тогда да, варнинги будут сильно влиять/тормозить.


sniknik   (2007-03-05 08:39:00) [23]

ЮЮ ©   (05.03.07 06:24) [4]
> Это [Access] - сервер ? :)
ну а почему нет? вообще это конечно не сервер, движок аксесс это COM обьект, но проще всего его рассматривать (по поведению) именно как сервер, такое же ядро, удаленное и независимое от программы с которым общаешься с помощью запросов... в общем полный аналог/модель (он кстати и удаленно может работать... через RDSServer.DataFactory/RDS.DataControl, вроде тоже части jet обьекты. т.е. тот же движок).

Ш-К   (05.03.07 07:57) [5]
> Эти варнинги очень влияют на скорость вставки.
это последнее о чем тебе стоит беспокоится  в плане влияния на скорость... по коду в [3] гораздо больше влияют - использование тяжелого ADOQuery, неиспользование параметров, а пересоставление запроса для каждой вставки, не отключение контрола (есть подозрение что он визуальный), и использование "клиентских" транзакций (хотя вот это последнее под вопросом, я так никогда не делаю поэтому не знаю тонкостей поведения а те кто делал и жаловался тут на скорость тем совет поменять на запросы говорили помогал...).
ну и потом у тебя логическая ошибка, несоответствие желаемого  
> Изначально мне надо, чтобы не вставлялись в таблицу дубли. И все. Без всяких варнингов.
с кодом, в коде будет не "невставление" дублей, а невставление всего блока если есть хоть один дубль, изза транзакции (которая в данном случае не нужна вообще. имхо (не знаю конкретики твоей задачи, но по догадгам и текущему описанию...)), и того что блок try except закрывает весь цикл.


ЮЮ   (2007-03-05 08:27:00) [24]

> Эти варнинги очень влияют на скорость вставки.


Для увеличения скорости, избежания вставки дубликатов и прочая, предлагаю немного модифицировать процесс импорта данных:

Создаnm таблицу FormDocImport такой же структуры, но без ключей - вставка в такую таблицу будет быстрее и не вызовет ошибок.
Затем одним запросом

insert into FormDoc (CodeForm, Document)
 select i.CodeForm, i.Document
 from
   ImportDocExport i
   LEFT JOIN FormDoc fd ON i.CodeForm = fd.CodeForm AND i.Document = fd.Document
   WHERE fd.CodeForm IS NULL

залить только "новые" данные.
FormDocImport следует очищать до и/или после импорта


Ш-К   (2007-03-05 07:57:00) [25]

Эти варнинги очень влияют на скорость вставки.


ЮЮ   (2007-03-05 06:24:00) [26]

> хотелось бы проверку возложить на сервер БД

Это [Access] - сервер ? :)
С другой стороны, проверку-то он выполняет - не дает вставить дубликаты

> Это мне не нравится.

Тебе не угодишь :)
Безмолвное поведение сервера может оказаться ещё большей проблемой в другом месте, где его ругательство помогло бы локализовать реальную ошибку


Ш-К   (2007-03-05 06:06:00) [27]

Можно перед инсертом селектить, но хотелось бы проверку возложить на сервер БД.
Вставляю так:

with ADOQueryFormDocInsert do
 begin
   Close;
   SQL.Clear;
   Connection.BeginTrans;
   S := '';
   try
     for I := 0 to AFormList.Count - 1 do
     begin
       vCode  := (AFormList.Objects[I] as TaaWrapperEntryForm).FCode;
       vDocID := Director.ActiveContent.Get_ID;
       S      := 'insert into FormDoc (CodeForm, Document)' +
         ' values (' + IntToStr(vCode) + ', ' + IntToStr(vDocID) + ');';
       SQL.Text := S;
       ExecSQL;    
     end;
   except
     Connection.RollbackTrans;
     Exit;
   end;
   Connection.CommitTrans;
 end;


От варнингов пока помогает такая штука:
try
 ExecSQL;
except
end;

Это мне не нравится.


ЮЮ   (2007-03-05 05:35:00) [28]

> Вставляю из Delphi около 1000 записей.

Как это делаешь?
Перед вставкой проверь возможное наличие


Ш-К   (2007-03-05 02:56:00) [29]

Вообще-то вопрос немного в другом.
Изначально мне надо, чтобы не вставлялись в таблицу дубли. И все. Без всяких варнингов.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо