Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизКопирование таблицы Найти похожие ветки
← →
Demiurg (2004-04-20 10:13) [0]Копирую таблицу из одной базы в другую. В одной записи этой таблицы есть очень длинное текстовое поле. И на этой записи вылетает ексепшн с сообщением что-то типа "Invalid BLOB hanlde". Походу такая длинная строка как blob рассматривается. Прбовал копировать разными способами - то же самое... Что это может быть и как лечить? Помогите, плиз.
Да, база InterBase. К исходной таблице обращаюсь через BDE, к результирующей напрямую.
← →
Ega23 © (2004-04-20 10:15) [1]Blob Size у алиаса чему равен?
← →
Demiurg (2004-04-20 10:39) [2]По-умолчанию 32. Blob to cash 64. Только что поэкспериментировал с ними в большую сторону - то же самое... Может уменьшить их? :)
← →
Соловьев © (2004-04-20 10:42) [3]
> Demiurg (20.04.04 10:13)
через поток не пробовал?
← →
Demiurg (2004-04-20 10:44) [4]
> Соловьев © (20.04.04 10:42)
Нет. А что, может помочь?
← →
Ega23 © (2004-04-20 11:01) [5]А очень длинное - это на сколько?
← →
Demiurg (2004-04-20 11:06) [6]
> А очень длинное - это на сколько?
Ну больше 300 символов.
← →
Ega23 © (2004-04-20 11:20) [7]Но меньше, например, 1000?
← →
Demiurg (2004-04-20 11:30) [8]
> Но меньше, например, 1000?
Да. Больше 400 нету.
← →
Demiurg (2004-04-20 11:30) [9]
> Но меньше, например, 1000?
Да. Больше 400 нету.
← →
Ega23 © (2004-04-20 11:40) [10]Тогда дело не в BlobSize.
Код давай! :о)
← →
Demiurg (2004-04-20 11:49) [11]Ну блин :)
sDDicti это TIBSQL
qSDicti - TQuery (указывает на исходную таблицу) в его SQL записано select * from dicti
sDDicti.SQL.Clear;
sDDicti.SQL.Add("insert into Dicti (ISN, PARISN, CHILD, CODEINT, CODE, SNAME, CODE2, CODE3, FNAME, FLTR,");
sDDicti.SQL.Add("TNAME, CNAME, ACTIV, SYNISN, NCHILD, UPDATED, UPDATEDBY, DESCRIPTION)");
sDDicti.SQL.Add("values");
sDDicti.SQL.Add("(:ISN, :PARISN, :CHILD, :CODEINT, :CODE, :SNAME, :CODE2, :CODE3, :FNAME,");
sDDicti.SQL.Add(":FLTR, :TNAME, :CNAME, :ACTIV, :SYNISN, :NCHILD, :UPDATED, :UPDATEDBY,");
sDDicti.SQL.Add(":DESCRIPTION)");
qSDicti.Close;
qSDicti.Open;
qSDicti.FetchAll;
rc := qSDicti.RecordCount;
qSDicti.First;
while not qSDicti.Eof do
begin
for i := 0 to qSDicti.FieldCount - 1 do
begin
sDDicti.Params[i].Value := qSDicti.Fields[i].Value;
end;
sDDicti.ExecQuery;
qSDicti.Next;
Inc(rn);
pr.Position := Round(100 * rn / rc);
Application.ProcessMessages;
end;
dmMain.trAgency.CommitRetaining;
Прбовал и другими способами копировать, например как в следующем куске:
while not qSRate.Eof do
begin
qDRate.Append;
for i := 0 to qSRate.FieldCount - 1 do
qDRate.Fields[i].Assign(qSrate.Fields[i]);
qDRate.Post;
qSRate.Next;
Inc(rn);
pr.Position := Round(100 * rn / rc);
Application.ProcessMessages;
end;
dmMain.trAgency.CommitRetaining;
← →
Nikolay M. © (2004-04-20 11:55) [12]Могу предположить, что ошибка вылетает на строках, длиннее 255-ти символов?
← →
Demiurg (2004-04-20 13:13) [13]
> Могу предположить, что ошибка вылетает на строках, длиннее
> 255-ти символов?
Скорее всего. Но это не решает проблему :)
← →
Курдль © (2004-04-20 13:20) [14]А простым скриптом типа
insert into TABLE_1 (FIELD_1, ... FIELD_N)
select TABLE_2 (FIELD_1, ... FIELD_N)
не пробовали? :)
← →
Johnmen © (2004-04-20 13:26) [15]Примерно так для BLOB
ms:=TMemoryStream.Create;
TBlobField(qSDicti.Fields[x]).SaveToStream(ms);
sDDicti.Params[x].LoadFromStream(ms,0);
ms.Free;
← →
Demiurg (2004-04-20 13:38) [16]
> А простым скриптом типа
Нет! Щас попробую. Мне такая идея что-то в голову не пришла... :)
← →
Johnmen © (2004-04-20 13:40) [17]>Щас попробую.
Не стОит пробовать. Не получится.
Вот если к обеим БД доступ через БДЕ, то можно...
← →
Demiurg (2004-04-20 13:41) [18]
> > А простым скриптом типа
>
> Нет! Щас попробую. Мне такая идея что-то в голову не пришла...
> :)
Хотя не... А как мне в одном скрипте использовать таблицы из разных баз? Через BDE имхо не получится...
← →
Курдль © (2004-04-20 13:41) [19]
> Не стОит пробовать. Не получится.
> Вот если к обеим БД доступ через БДЕ, то можно...
А, я упустил пояснение, что таблицы в разных БД :(
← →
Johnmen © (2004-04-20 13:47) [20]http://213.248.61.64/cgi-bin/slovari/BBB.pl?length=&sence=&power=&url=http://www.delphimaster.ru/cgi-bin/forum.pl?id=108 2441582%26n=1
:)))
← →
Demiurg (2004-04-20 13:59) [21]
> Johnmen
Ржалъ долго :)))
← →
Demiurg (2004-04-20 16:35) [22]
> Примерно так для BLOB
> ms:=TMemoryStream.Create;
> TBlobField(qSDicti.Fields[x]).SaveToStream(ms);
> sDDicti.Params[x].LoadFromStream(ms,0);
> ms.Free;
Та же история :( Все BLOB поля нормально копируются в стрим,но если поле большое, то вылетает на SaveToStream с той же ошибкой...
← →
Johnmen © (2004-04-20 16:58) [23]>что-то типа "Invalid BLOB hanlde".
Возможно BLOBS TO CACHE надо побольше, т.е. >= кол-ву записей в qSDicti.
← →
Ega23 © (2004-04-20 17:02) [24]Johnmen © (20.04.04 16:58) [23]
Он же говорил, что максимально - около 300 символов.
← →
Johnmen © (2004-04-20 17:04) [25]>Ega23 © (20.04.04 17:02) [24]
А я говорю о количестве, а не качестве...:)
← →
Demiurg (2004-04-20 17:07) [26]
> Возможно BLOBS TO CACHE надо побольше, т.е. >= кол-ву записей
> в qSDicti.
Может вылететь и в самом начале итерации, если запись с длинным description (это поле такое) попадется. Проверял.
← →
Johnmen © (2004-04-20 17:09) [27]Ну даже не знаю... Видимо проблемы с БДЕ...
Кстати, какого типа поле ?
← →
Demiurg (2004-04-20 17:29) [28]Поле Blob (точнее VARCHAR 1024, но это же blob) :) На строках до 255 работает нормально, выше вылетает. Причем при любом обращении к полю. Я тоже сделал вывод, что BDE глючит. Решил, короче, получить через алиас путь к базе, и работать с данной таблице напрямую :)
Все огромное спасибо за ответы!
← →
Johnmen © (2004-04-20 17:32) [29]>точнее VARCHAR 1024, но это же blob
Нет, что ты !!!!!!!!!!
← →
Demiurg (2004-04-20 17:50) [30]Однако IsBlob выдает true...
← →
Johnmen © (2004-04-20 17:53) [31]Это БДЕ тупит. А может версия старая...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.037 c