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

Вниз

Проблема с блоб полем.   Найти похожие ветки 

 
Still Swamp   (2007-10-09 16:34) [0]

Использую компонент TIBStoredProc.
Получаю параметр через TParam.
Все благополучно, за исключением того что из блоб поля получаю вместо его содержимого фразу "(Blob)"

Пробовал по всякому. Эффект один и тот же:

Buffer:=iParam.AsString;
Buffer:=iParam.AsBlob;
iParam.GetData(Buffer);


 
Desdechado ©   (2007-10-09 16:55) [1]

CreateBlobStream
?


 
Still Swamp   (2007-10-09 17:01) [2]

И куда его?
CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
Там TField а у меня TParam.


 
Маша Шрайбер ©   (2007-10-09 17:05) [3]

>> И куда его?

В Парам его! И F1 читай.


 
Still Swamp   (2007-10-09 17:11) [4]

Извиняюсь прочитал. И все же не понял тогда.
Еще раз. После исполнения SP у меня есть группа параметров возвращаемых SP.
Я из читаю. SP не возвращает DataSet, а соответсвенно у меня нет списка TField.

CreateBlobStream - я исполюзую для чтения из поля. Передавая ему поле первым параметром.

Но чем он мне поможет, когда я пытаюсь получить Blob из TParam.


 
Виталий Панасенко(дом)   (2007-10-09 17:29) [5]

И  где эта фраза (Blob) видна ?


 
Still Swamp   (2007-10-09 17:30) [6]

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

К стати GetDataSize возврвщвет 6.


 
Johnmen ©   (2007-10-09 19:32) [7]


> Still Swamp

Можно поинтересоваться, как выглядит ХП, возвращающая блоб, в части выходного параметра и манипуляций с ним?


 
Still Swamp   (2007-10-10 12:16) [8]

Вот изловил SQLщика. Он дал такой текст:

CREATE PROCEDURE ORDERSUBDIVISION_REC_PRE_CONF(
 IN_UID INTEGER DEFAULT NULL)
RETURNS(
 UID INTEGER,
 DTINSERT TIMESTAMP,
 DTUPDATE TIMESTAMP,
 IDENTIFY VARCHAR(50) CHARACTER SET WIN1251,
 UIDSOBJECT BIGINT,
 GUIDSUBDIVISION VARCHAR(50) CHARACTER SET WIN1251,
 GUID VARCHAR(50) CHARACTER SET WIN1251,
 PARAMS VARCHAR(4000) CHARACTER SET WIN1251,
 CHRONOSACTUAL INTEGER,
 DTCLIENT TIMESTAMP,
 DATASET BLOB SUB_TYPE 1 CHARACTER SET WIN1251,
 INF VARCHAR(255) CHARACTER SET WIN1251,
 WAR VARCHAR(255) CHARACTER SET WIN1251,
 ERR VARCHAR(255) CHARACTER SET WIN1251,
 DEB VARCHAR(255) CHARACTER SET WIN1251)
AS
DECLARE VARIABLE STATUS INTEGER;
begin

 FOR SELECT
 ORDERSUBDIVISION.UID,
 ORDERSUBDIVISION.STATUS,
 ORDERSUBDIVISION.DTINSERT,
 ORDERSUBDIVISION.DTUPDATE,
 OBJECTPROPERTY.IDENTIFY,
 OBJECT.UIDS,
 SUBDIVISION.GUID,
 ORDERSUBDIVISION.GUID,
 ORDERSUBDIVISION.PARAMS,
 ORDERSUBDIVISION.CHRONOSACTUAL,
 ORDERSUBDIVISION.DTCLIENT,
 ORDERSUBDIVISION.DATASET,
 CASE WHEN ORDERSUBDIVISION.STATUS>3 THEN "Yoi caienu ia aie?ia ioi?aaeyony. " ELSE NULL END
FROM ORDERSUBDIVISION
     LEFT OUTER JOIN OBJECTPROPERTY ON ORDERSUBDIVISION.UIDOBJECTPROPERTY=OBJECTPROPERTY.UID
     LEFT OUTER JOIN OBJECT ON OBJECT.UID=ORDERSUBDIVISION.UIDOBJECT
     LEFT OUTER JOIN SUBDIVISION ON ORDERSUBDIVISION.UIDSUBDIVISION=SUBDIVISION.UID
WHERE (ORDERSUBDIVISION.UID=:IN_UID)
INTO
 :UID,
 :STATUS,
 :DTINSERT,
 :DTUPDATE,
 :IDENTIFY,
 :UIDSOBJECT,
 :GUIDSUBDIVISION,
 :GUID,
 :PARAMS,
 :CHRONOSACTUAL,
 :DTCLIENT,
 :DATASET,
 :ERR
 DO SUSPEND;
 
 UPDATE ORDERSUBDIVISION
        SET STATUS=2
 WHERE UID=:IN_UID and ORDERSUBDIVISION.STATUS<4;
end


 
Desdechado ©   (2007-10-10 12:26) [9]

>  SP не возвращает DataSet, а соответсвенно у меня нет списка TField.
Это утверждение явно противоречит приведенному тексту процедуры, т.к.  DO SUSPEND; возвращает именно датасет.

В этом случае вообще лучше делать SELECT * FROM procname()


 
Still Swamp   (2007-10-10 13:19) [10]

DO SUSPEND появилось именно в результате борьбы с вышеуказанной проблемой.
В конце концов и сделали SELECT, и блоб из Field возвращается благополучно, однако, хотелось бы узнать причину столь странного фифекта.


 
Desdechado ©   (2007-10-10 13:36) [11]

> причину столь странного фифекта
Возвращаемся к исходному - текст процедуры со странным фифектом где?


 
Still Swamp   (2007-10-10 13:48) [12]

Вот оно.

CREATE PROCEDURE ORDERSUBDIVISION_REC_PRE_CONF2(
 IN_UID INTEGER DEFAULT NULL)
RETURNS(
 UID INTEGER,
 DTINSERT TIMESTAMP,
 DTUPDATE TIMESTAMP,
 IDENTIFY VARCHAR(50) CHARACTER SET WIN1251,
 UIDSOBJECT BIGINT,
 GUIDSUBDIVISION VARCHAR(50) CHARACTER SET WIN1251,
 GUID VARCHAR(50) CHARACTER SET WIN1251,
 PARAMS VARCHAR(4000) CHARACTER SET WIN1251,
 CHRONOSACTUAL INTEGER,
 DTCLIENT TIMESTAMP,
 DATASET BLOB SUB_TYPE 1 CHARACTER SET WIN1251,
 INF VARCHAR(255) CHARACTER SET WIN1251,
 WAR VARCHAR(255) CHARACTER SET WIN1251,
 ERR VARCHAR(255) CHARACTER SET WIN1251,
 DEB VARCHAR(255) CHARACTER SET WIN1251)
AS
DECLARE VARIABLE STATUS INTEGER;
begin

 SELECT
 ORDERSUBDIVISION.UID,
 ORDERSUBDIVISION.STATUS,
 ORDERSUBDIVISION.DTINSERT,
 ORDERSUBDIVISION.DTUPDATE,
 OBJECTPROPERTY.IDENTIFY,
 OBJECT.UIDS,
 SUBDIVISION.GUID,
 ORDERSUBDIVISION.GUID,
 ORDERSUBDIVISION.PARAMS,
 ORDERSUBDIVISION.CHRONOSACTUAL,
 ORDERSUBDIVISION.DTCLIENT,
 ORDERSUBDIVISION.DATASET,
 CASE WHEN ORDERSUBDIVISION.STATUS>3 THEN "Yoi caienu ia aie?ia ioi?aaeyony. " ELSE NULL END
FROM ORDERSUBDIVISION
     LEFT OUTER JOIN OBJECTPROPERTY ON ORDERSUBDIVISION.UIDOBJECTPROPERTY=OBJECTPROPERTY.UID
     LEFT OUTER JOIN OBJECT ON OBJECT.UID=ORDERSUBDIVISION.UIDOBJECT
     LEFT OUTER JOIN SUBDIVISION ON ORDERSUBDIVISION.UIDSUBDIVISION=SUBDIVISION.UID
WHERE (ORDERSUBDIVISION.UID=:IN_UID)
INTO
 :UID,
 :STATUS,
 :DTINSERT,
 :DTUPDATE,
 :IDENTIFY,
 :UIDSOBJECT,
 :GUIDSUBDIVISION,
 :GUID,
 :PARAMS,
 :CHRONOSACTUAL,
 :DTCLIENT,
 :DATASET,
 :ERR;

 UPDATE ORDERSUBDIVISION
        SET STATUS=2
 WHERE UID=:IN_UID and ORDERSUBDIVISION.STATUS<4;
end


 
Маша Шрайбер ©   (2007-10-10 14:20) [13]

Таким образом вы получите (указав SUSPEND, естественно) в вых. параметре всего лишь "указатель" на BLOB. А чтобы считать значение, надо "напрямую" обращаться к полю таблицы. Об этом написано на вашем любимом ibase.ru


 
Desdechado ©   (2007-10-10 16:23) [14]

Из справки TParam:
Note: Applications seldom need to read AsBlob because Blob fields can’t be used as output parameters.


 
Сергей М. ©   (2007-10-10 16:42) [15]


> Still Swamp   (10.10.07 13:48) [12]
>
> Вот оно.
>


И где тут фигурирует blob ?


 
Desdechado ©   (2007-10-10 17:24) [16]

> И где тут фигурирует blob ?
Вот
DATASET BLOB SUB_TYPE 1 CHARACTER SET WIN1251,


 
Сергей М. ©   (2007-10-10 17:28) [17]


> Desdechado ©   (10.10.07 17:24) [16]


А, вижу.

Мартышка к старости)


 
Still Swamp   (2007-10-10 19:04) [18]

исходя из  фразы "Blob fields can’t be used as output parameters" признаем это явление фичей TParam и тема закрыта?

Просто обидно TParameter + MSSQL такое делают.



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

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

Наверх




Память: 0.49 MB
Время: 0.042 c
11-1179211668
WindLord
2007-05-15 10:47
2008.02.24
Проблема с отображением компонентов в KOL/МСК 2.60, Delphi 7


15-1200776703
Riply
2008-01-20 00:05
2008.02.24
Рекурсивная работа с FindFirst/Next


15-1200657798
Lip
2008-01-18 15:03
2008.02.24
Как на агнлийском будет


2-1201801123
Res
2008-01-31 20:38
2008.02.24
WinApi


2-1201595980
Dracula
2008-01-29 11:39
2008.02.24
Не дать уснуть компьютеру.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский