Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];

Вниз

TBlobField и приведение типов   Найти похожие ветки 

 
ChaoX ©   (2007-08-19 06:54) [0]

Нужно кинуть в конструктор TBlobStream параметр типа TBlobField, и логично, что я пытаюсь сделать так:
stream := TBlobStream.Create((IBTable1.FieldByName("NH_MAP") as TBlobField), bmRead);
Ан нет! Говорит, что "Invalid typecast".
Я попробовал тогда узнать, какого на самом деле типа поле вызовом ClassName и сильно удивился узнав, что это... TBlobField!
Тогда я сделал проверку на is:
if IBTable1.FieldByName("NH_MAP") is TBlobField then
begin
 ShowMessage("1");
end;

И она сработала!
Однако

if IBTable1.FieldByName("NH_MAP") is TBlobField then
begin
 stream := TBlobStream.Create((IBTable1.FieldByName("NH_MAP") as TBlobField), bmRead);
end;


Опять выдаёт ошибку...

Может хоть кто-нибудь объяснит мне, что происходит?
Жду вашей помощи


 
Reindeer Moss Eater ©   (2007-08-19 11:41) [1]

Я попробовал тогда узнать, какого на самом деле типа поле вызовом ClassName и сильно удивился узнав, что это... TBlobField!

А нет никакой разницы какого типа поле.
Так как FieldByName все равно возвращает тип TField.


 
Плохиш ©   (2007-08-19 16:41) [2]


> ChaoX ©   (19.08.07 06:54)  

Класс TBlobField имеет метод SaveToStream...


 
ChaoX ©   (2007-08-19 17:03) [3]


> Класс TBlobField имеет метод SaveToStream...

Ну и что?
Проблемы возникают как раз на приведении к типу TBlobField.
Я не могу получить TBlobField и, соответственно, вызывать его методы.


 
Плохиш ©   (2007-08-19 17:15) [4]


> Ну и что?

Ничего, продолжайте.


 
Desdechado ©   (2007-08-19 17:18) [5]

TDataset.CreateBlobStream


 
ChaoX ©   (2007-08-19 17:34) [6]


> Desdechado ©   (19.08.07 17:18) [5]

Большое спасибо.

Кстати, мне просто интересно, из-за чего возникал тот глюк?


 
kaif ©   (2007-08-21 15:24) [7]

В Help касательно конструктора TBlobStream.Create написано вот эта рекомендация:

Different types of dataset use different classes of BLOB streams. It is usually a better idea to call the dataset’s CreateBlobStream method than to call the BLOB stream constructor. - различные типы датасетов используют различные классы блобстримов. Обычно предпочтительнее вызывать метод CreateBlobStream, реализованный конкретным датасетом, чем вызывать этот вот конструктор блобстрима.

Возможно у тебя неверный typecast вовсе не в классе поля, а в классе самого стрима. Попробуй выяснить classname стрима, порожденного методом TDataset.CreateBlobStream.

Например у меня вот такой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(IBQuery1.CreateBlobStream(IBQuery1.FieldByName("некое поле"), bmRead).ClassName)
end;


вернул имя класса - TIBDSBlobField


 
kaif ©   (2007-08-21 15:25) [8]

Тьфу (опечатался), то есть TIBDSBlobStream


 
kaif ©   (2007-08-21 15:42) [9]

Так что если хочешь вызывать конструктор блобстhима, то ливо вызывай метод датасета, как рекомендует Борланд, либо используй нужный конструктор, предусмотренный производителем.
Например  в Help по IBX есть такой пример:

procedure TForm1.Button1Click(Sender: TObject);

var
 Stream1, Stream2 : TIBBlobStream;
begin
 Stream1 := TIBBlobStream.Create(IBTable1Notes);
 try
   Stream1.Mode = bmRead;
   IBTable2.Edit;
   { here’s a different way to create a blob stream }
   { note that with this one, we don’t need a try.. finally clause }
   { because we are not responsible for freeing the stream }
   Stream2 := IBTable2.CreateBlobStream(IBTable2.FieldByName("Remarks"), bmReadWrite);
   Stream2.CopyFrom(Stream1, Stream1.Size);

   IBTable2.Post;
 finally
   Stream1.Free;
 end;
end;


Настоящая же причина того, что класс TBlobStream вообще нельзя так использовать, как я подозреваю, состоит в том, что этот класс определен в модуле DBTables VCL, который обслуживает исключительно BDE-соместимые классы и с нативными компонентами библиотеки InterBase Exepress (IBX) не должен использоваться в принципе.


 
kaif ©   (2007-08-21 15:46) [10]

Так что это вовсе не глюк, а неверная работа с блобстримом, когщда используешь нативную клиентскую библиотеку компонентов доступа типа IBX.

И если у тебя в uses модуля в результате осталась ссылка на DBTables, желательно ее все же убрать оттуда, если не хочешь при компиляции присобачивать к своему экзешнику всю поддержку BDE, которавя в данном случае тебе вовсе не требуется.


 
kaif ©   (2007-08-21 15:51) [11]

Кстати, если тебе интересно, конечно, разобраться до конца - обрати внимание на то, что классы TIBBlobStream и TIBDSBlobStream не являются даже потомками класса TBlobStream, а происходят от базового класса TStream непосредственно.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.048 c
15-1195736070
Кот
2007-11-22 15:54
2007.12.23
css меню


2-1196404505
WestNik
2007-11-30 09:35
2007.12.23
Создание TabSheet динамически


2-1195710167
Costy
2007-11-22 08:42
2007.12.23
Ускорения tClientSocket (tserverSocket)


2-1196405007
ardent
2007-11-30 09:43
2007.12.23
table order


15-1195740783
@!!ex
2007-11-22 17:13
2007.12.23
Оцените код.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский