powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как на VC++ получить выходной параметр extended stored procedure
7 сообщений из 7, страница 1 из 1
Как на VC++ получить выходной параметр extended stored procedure
    #33581860
все дело на VC++ и SQL2000

есть некая extended stored procedure "xp_Proc1"
в этой процедуре присваивается значение выходному параметру

DWORD dwData=123456;
srv_paramsetoutput(srvproc, 2,(BYTE*)&dwData,sizeof(DWORD), FALSE)

вызываем эту процедуру

_ParameterPtr p=cmd->CreateParameter(L"name",adVarChar,adParamInput,sizeof(TCHAR)*strlen(szname),szname);
cmd->Parameters->Append(p);
p=cmd->CreateParameter(L"@pdata",adUnsignedBigInt,adParamOutput,sizeof(DWORD));
cmd->Parameters->Append(p);
cmd->CommandText="master..xp_Proc1";
cmd->Execute(NULL,NULL,adCmdStoredProc);

Процедура нормально отрабатывает, ошибок не выдает, но
после "Execute" пытаюсь прочитать выходной параметр
DWORD dwLen=cmd->Parameters->Item[1L]->Value;
и ничего - всегда 0
Как же получить значение

Еще один момент:
Пишем дополнительно обычную stored procedure "sp_Proc2"

CREATE PROCEDURE sp_proba1 @name VARCHAR, @pdata BIGINT OUTPUT AS
exec master..xp_Proc1 @name, @pdata OUTPUT
GO

вызываем аналогично (только cmd->CommandText="sp_Proc2")

Так в этом случае в ext.proc. "xp_Proc1" в качестве первого параметра (строка) передается только первый символ
а выходной параметр все равно ==0

Почему в этом случае передается только один(первый) символ?
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33582161
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее вызов с клиента XP и SP не должны ничем отличаться. OpenServer или (у MS) ODS для этого и нужны. Попробуй поискать где ошибка в XP. Может там что-то не так. Попробуй повызывать из другой процедуры (SP) и добиться того, чтобы приходили и уходили параметры правильно.
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33582202
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что происходит если сделать так в QA?

Код: plaintext
1.
2.
declare @pdata bigint 
exec master..xp_Proc1 "имя", @pdata OUTPUT
select @pdata

какой выдается результат ?

в коде ошибок у тебя нету.
вот что у меня было с crc64 :


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
RETCODE __declspec(dllexport) xp_crc64(SRV_PROC *srvproc)
{
    try
    {
        if( srv_rpcparams(srvproc) <  2  ) 
        {
            srv_sendmsg(srvproc, SRV_MSG_ERROR, GETTABLE_ERROR, SRV_INFO, (DBTINYINT)  0 , NULL,  0 ,  0 , 
                "Wrong number of parameters - must be four : word varbinary IN, codepage int IN, crc64 char(20) OUT", SRV_NULLTERM);
            srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE),  0 ,  0 );
            return(- 1 );
        }
  
        if( srv_paramtype(srvproc,  1 ) != SRVVARBINARY || srv_paramtype(srvproc,  2 ) != SRVINTN )
        {
            char *msg = "Error executing extended stored procedure: Invalid parameter type.";
            // Send error message and return.
            srv_sendmsg(srvproc, SRV_MSG_ERROR, GETTABLE_ERROR, SRV_INFO, (DBTINYINT)  0 , NULL,  0 ,  0 , msg, SRV_NULLTERM);
            // A SRV_DONE_MORE instead of a SRV_DONE_FINAL must complete the
            // result set of an Extended Stored Procedure.
            srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE),  0 ,  0 );
            return(- 1 );
        } 
        // word
        size_t szlen = srv_paramlen(srvproc,  1 );
		wchar_t buff[LEN_BUFFER+ 1 ] = { 0 };
        if( szlen > LEN_BUFFER )
        {
            szlen = LEN_BUFFER;
        }
        memcpy( buff, srv_paramdata(srvproc,  1 ), szlen );

        DBINT codepage =  1252 ;
        memcpy(&codepage, srv_paramdata(srvproc,  2 ), srv_paramlen(srvproc,  2 ));
        if( codepage <  0  )
        {
            codepage =  1252 ;
        }
        unsigned __int64 rs = hashWord_crc64( buff, codepage );
		char str[ 256 ] = { 0 };
        _snprintf( str, sizeof(str)- 1 , "%I64d", rs );

        if( srv_rpcparams(srvproc) ==  3 )
        {
            srv_paramsetoutput(srvproc,  3 , (unsigned char *)str, strlen(str), FALSE);
        }else
        {
            size_t len = (wcslen(buff) <<  1 ) +  2 ;
            srv_describe(srvproc,  1 , "crc64", SRV_NULLTERM, SRVINT8, sizeof(__int64), SRVINT8, sizeof(__int64), NULL); 
            srv_describe(srvproc,  2 , "txt", SRV_NULLTERM, SRVNVARCHAR,  64 , SRVNVARCHAR,  64 , NULL); 

            srv_setcollen (srvproc,  1 , sizeof(__int64));    srv_setcoldata (srvproc,  1 , (void *)&rs);
            srv_setcollen (srvproc,  2 , len);    srv_setcoldata (srvproc,  2 , (void *)buff);

		    srv_sendrow(srvproc);
        }
        srv_senddone (srvproc, SRV_DONE_COUNT | SRV_DONE_MORE, (DBUSMALLINT)  0 ,  1 );
        return  0 ;
    }
    catch(...)
    {
        srv_sendmsg(srvproc, SRV_MSG_ERROR, GETTABLE_ERROR, SRV_INFO, (DBTINYINT)  0 , NULL,  0 ,  0 , "Unknown error in xp_crc64", SRV_NULLTERM);
        srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE),  0 ,  0 );
        return - 1 ;
    }
    return - 1 ;
}
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33582263
В общем дело оказалось в типах данных
Во-первых почему-то не воспринимаются adUnsignedBigInt
просто adUnsignedInt (и INT соотв) -пожалуйста, заработало
Во-вторых
CREATE PROCEDURE sp_proba1 @name VARCHAR
здесь при объявлении надо было указать длину VARCHAR
Если заменить на TEXT - то тогда не надо указывать длину строки

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

_RecordsetPtr rstt=cmd->Execute(NULL,NULL,adCmdStoredProc);

значение выходного параметра опять в 0

Да и с наботом записей заморочки -
если формируется один столбец с типом SRVIMAGE - то нормально потом считывается, а вот если добавить еще один столбец - то получается всякая ерунда (именно со столбцом с бинарными данными)

Бедем разбираться дальше
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33582503
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторС этим разобрался, появилось новое пока не могу получить одновременно
и значение вызодного параметра, и набор данных
т.е. при вызове
Значение выходных параметров нужно получать после того, как дофетчен/закрыт набор.
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33582720
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде как в самом скуле есть хорошие примеры ...
...
Рейтинг: 0 / 0
Как на VC++ получить выходной параметр extended stored procedure
    #33585719
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтарыйПеньВ общем дело оказалось в типах данных
Во-первых почему-то не воспринимаются adUnsignedBigInt
просто adUnsignedInt (и INT соотв) -пожалуйста, заработало


да это так, даже в QA обрезается unsigned __int64 из esp. А если попробовать adBigInt ?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как на VC++ получить выходной параметр extended stored procedure
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]