Главная страница
    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.046 c
15-1200923748
Dmitry S
2008-01-21 16:55
2008.02.24
Печать с помощью mshtml.dll,PrintHTML без диалога


15-1201188142
Anatoly Podgoretsky
2008-01-24 18:22
2008.02.24
Что хотят, то и творят.


15-1200454736
ply
2008-01-16 06:38
2008.02.24
MySQL компонент


2-1201679334
trubin
2008-01-30 10:48
2008.02.24
Как отличить CD от DVD. Как приводы делают это?


15-1201277000
Petr V. Abramov
2008-01-25 19:03
2008.02.24
TWO_PHASE_COMMIT в шлюзе Oracle -> MSSQL





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