Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
Имеется БД с овер 15 000 записями в одной таблице (id_студента, фото студента). БД - FireBird. Нужно таблицу с фото перекопировать в локальную БД (Оракл). Выполняю средствами DELPHI И вроде как все получается. Но... при попытках вставки сразу всех записей последовательно я получаю сообщение " Out of memory". Собственно оно и понятно, почему. 1. Как можно вставить все записи? Или поделить количество, допустим на 3, и и вставлять в цикле? 2. Как сделать проверку на дубли? Сейчас поле id_студента, - первичный ключ, но при копировании вставилось несколько сот пустых стотрок, так как видимо, сначала вствляется пустая строка, потом значение. Если значение уже есть, то возникает исключение "unigue constant", вставка не происходит, но пустая строка остается. 3. Если делить на 3 цикла, то программа после вставки 10 000 завысает. Вероятно, происходят утечки памяти. КАк это проверить избежать? Вот код вставки FDQuery1.first; while not (FDQuery1.Eof) do begin try qGET_PERS_FOTO.Open; qGET_PERS_FOTO.Insert; qGET_PERS_FOTO.FindField('foto').Assign(FDQuery1.FieldByName('foto')); qGET_PERS_FOTO.FindField('pers_id').Assign(FDQuery1.FieldByName('pers_id')); qGET_PERS_FOTO.Post; FDQuery1.Next; Except On e: Exception Do begin if Pos('unique constraint', e.Message)> 0 then begin FDQuery1.Next; end; end; end; |
15 фев 21, 15:39 [22281189] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 31969 |
15.02.2021 15:39, WНаталья пишет: > при попытках вставки сразу всех записей последовательно я получаю сообщение " Out of memory". > Собственно оно и понятно, почему. почему? Posted via ActualForum NNTP Server 1.5 |
15 фев 21, 15:42 [22281191] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
И покажите DDL таблиц |
||||||||||||||||||||
15 фев 21, 15:59 [22281201] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1769 |
Не используй датасет, вот и всё. |
||||
15 фев 21, 16:11 [22281209] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
_Vasilisk_, прошу прощения, новичок в этом всем. Пытаюсь разобраться. Что такое dll таблицы? |
15 фев 21, 16:39 [22281234] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
_Vasilisk_, не очень понимаю, как использовать TFDCommand. Допустим, написала я внутри компонента запрос на выборку всех записей. А дальше как использовать его при вставке ? |
15 фев 21, 16:51 [22281239] Ответить | Цитировать Сообщить модератору |
Гаджимурадов Рустам Member Откуда: Сообщений: 62404 |
WНаталья> Нужно таблицу с фото перекопировать в локальную БД (Оракл). А что такое локальная БД? > Или поделить количество, допустим на 3, и и вставлять в цикле? Не надо делить на 3. Вставляйте по 1 записи, потом сделаете коммит для всей пачки. Для Вашего уровня знаний и разовой задачи этого хватит. > 2. ... при копировании вставилось несколько сот пустых стотрок, Удалите их. > так как видимо, сначала вствляется пустая строка, потом значение. Нет, Оракл такой фигнёй не страдает. Posted via ActualForum NNTP Server 1.5 |
15 фев 21, 17:11 [22281256] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26952 |
1. Нужно перейти на query. 2. Вставку делать во временную таблицу, на которой нет никаких триггеров, ограничений и индексов. 3. После заполнения п.2 - вызвать процедуру на сервере (придется её написать), которая сделает остальную работу (проверит и перекинет в нормальную таблицу). |
||||
15 фев 21, 17:15 [22281259] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
WНаталья, грузишь всю таблицу в память, а надо использовать unidirectional |
15 фев 21, 17:20 [22281261] Ответить | Цитировать Сообщить модератору |
Gerasimenko Member Откуда: Сообщений: 4643 |
Неужели Firebird не линкуется к Oracle? Если линкуется, то дельфи нафиг не нужен. |
15 фев 21, 17:46 [22281277] Ответить | Цитировать Сообщить модератору |
Гаджимурадов Рустам Member Откуда: Сообщений: 62404 |
Через ODBC/JDBC линкуется, конечно. Posted via ActualForum NNTP Server 1.5 |
15 фев 21, 18:14 [22281302] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Но не работает с блобами. Посмотрите уже топики аффтарши. Posted via ActualForum NNTP Server 1.5 |
||
15 фев 21, 18:48 [22281314] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
Dimitry Sibiryakov, да, не линкуется. Оракрл воспринимает блоб как лонг раф и режет его до 32к. (если коротко) Сообщение было отредактировано: 15 фев 21, 19:39 |
15 фев 21, 19:46 [22281337] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
WНаталья, тебе не знакомо свойство unidirectional ? Сообщение было отредактировано: 15 фев 21, 19:53 |
15 фев 21, 19:51 [22281338] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39683 |
так это не оракел виноват, а дрова ODBC |
||||
15 фев 21, 19:53 [22281341] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
MaratIsk, к сожалению нет, не знакомо |
15 фев 21, 19:54 [22281342] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Правда? Какой тип данных должен вернуть драйвер чтобы Oracle HS воспринял его как BLOB? SQL_LONGVARBINARY не канает. Posted via ActualForum NNTP Server 1.5 |
||
15 фев 21, 20:04 [22281345] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
к предыдущему сообщению приаттачил файл unidirectional - это свойство query создающее однонаправленный набор указываешь UniDirectional := TRUE; и бежишь по набору, формируя insert для целевой бд out of memory не будет, потому что такой запрос не буферизует все записи в памяти, а только текущую запись |
||||
15 фев 21, 20:08 [22281349] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39683 |
а чойта не канает ? SQL_BINARY тоже побоку ? Сообщение было отредактировано: 15 фев 21, 20:11 |
||||||
15 фев 21, 20:16 [22281353] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
MaratIsk, не вижу у компонента такого свойства. Для ADO есть, а для FireDac - нет К сообщению приложен файл. Размер - 6Kb |
15 фев 21, 21:09 [22281376] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
выбрось FireDac - для столь простой задачи как перекачка данных достаточно IBDatabase, IBCustomDataSet, IBQuery |
||||
15 фев 21, 21:13 [22281378] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
MaratIsk, IBDatabase в моем случае не вариант. при коннекте к БД получаю ошибку типа "структура БД не поддерживается". |
15 фев 21, 21:29 [22281381] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
WНаталья, вариант-вариант :) какая версия у сервера ФБ ? |
15 фев 21, 21:36 [22281383] Ответить | Цитировать Сообщить модератору |
WНаталья Member Откуда: Мурманск Сообщений: 68 |
MaratIsk, 3.0 |
15 фев 21, 21:40 [22281384] Ответить | Цитировать Сообщить модератору |
MaratIsk Member Откуда: Almaty, Kazakhstan Сообщений: 2556 |
WНаталья, значит надо подключить fbclient.dll 3-ей версии только и всего т.е. положить рядом с приложением |
15 фев 21, 21:44 [22281386] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |