powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Доступ к Binary OUTPUT полю через ADO
14 сообщений из 14, страница 1 из 1
Доступ к Binary OUTPUT полю через ADO
    #33020033
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с проблемой, никак не могу разрешить.
Есть хранимая процедура на MSSQL:
sp_Test_Out @Value binary (1024) OUTPUT, @Length int OUTPUT

Я хочу посредством C++ и ADO получить доступ к параметру Value. С простыми типами (например, int) все здорово... А вот с binary(1024) чего-то никак!

Пытался делать так:

Код: plaintext
1.
2.
3.
4.
5.
_ParameterPtr param1 = pcmdByRoyalty->CreateParameter("Value",adBinary,adParamOutput, 1024 );
        pcmdByRoyalty->Parameters->Append(param1);
...
SAFEARRAY *sa = (SAFEARRAY*)param1->Value.parray;
BYTE *pBytes = new BYTE[ 1024 ];
SafeArrayAccessData(sa,(void**)&pBytes);

Заранее большое спасибо ответившим!
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33020348
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Встречный вапрос: что ты хотел этим сказать ?

BYTE *pBytes = new BYTE[1024];
SafeArrayAccessData(sa,(void**)&pBytes);

Может все-таки так надо было ?
SafeArrayAccessData(sa,(void*)pBytes);
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33022170
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел сказать лишь то, что сигнатура SafeArrayAccessData требует void** в качестве второго параметра...
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33025776
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОК! Господа, кто-нибудь имел хоть какой-нибудь опыт работы с преобразованием типа MSSQL binary(N) к структурам C++?
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33025916
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsidОК! Господа, кто-нибудь имел хоть какой-нибудь опыт работы с преобразованием типа MSSQL binary(N) к структурам C++?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if exists(select * from dbo.sysobjects where id = object_id(N'dbo.usp_Binary_Read') and objectproperty(id, N'IsProcedure') =  1 )
   drop procedure dbo.usp_Binary_Read
go
create procedure dbo.usp_Binary_Read
   @img varbinary( 1000 ) out
as set nocount on
   set @img = convert(varbinary( 1000 ), 'qwertyuiopasdfghjklzxcvbnm')
   return( 0 )
go

Код: 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.
#include <comutil.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <iostream>

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
         no_namespace rename("EOF", "adoEOF")

struct ZC_COMInitialize {
  ZC_COMInitialize(){CoInitialize( 0 ); }
 ~ZC_COMInitialize(){CoUninitialize();}
}; 
ZC_COMInitialize COMInit;

int main(){
  long hFile( 0 ); SAFEARRAY  *psa; char HUGEP *ptr; _variant_t v;
  _bstr_t ConnStr = "Provider=SQLOLEDB;       \
                     Data Source=(local);     \
                     Initial Catalog=pubs;    \
                     Integrated Security=SSPI";
  _ConnectionPtr conn;
  try {
    conn.CreateInstance(__uuidof(Connection));
    conn->CursorLocation = adUseServer;
    conn->IsolationLevel = adXactReadCommitted;
    conn->Attributes     =  0 ;
    conn->Open(ConnStr,"","",adConnectUnspecified);

    _CommandPtr cmd;
    cmd.CreateInstance(__uuidof(Command));
    cmd->ActiveConnection = conn;
    cmd->CommandType      = adCmdStoredProc;
    cmd->CommandText      = "dbo.usp_Binary_Read";

    ParametersPtr pars = cmd->Parameters;
    pars->Append(cmd->CreateParameter("@RET", adInteger,   adParamReturnValue,     0 ,  0 ));
    pars->Append(cmd->CreateParameter("@IMG", adVarBinary, adParamOutput,       1000 , ""));
    cmd->Execute( 0 , 0 ,adCmdStoredProc);

    v = pars->Item[1L]->Value; 
    if(v.vt != VT_EMPTY){
      hFile = _open("c:\\temp\\img.img", _O_BINARY | _O_CREAT | _O_TRUNC |_O_WRONLY,_S_IWRITE);
      psa = v.parray;
      SafeArrayAccessData(psa, (void HUGEP**)&ptr);
      _write(hFile, ptr, psa->rgsabound->cElements);
      SafeArrayUnaccessData(psa);
    }
  }catch(_com_error &e){
    std::cerr << " Error " << (const char*)e.Description() << std::endl;
  }
  if(hFile >  0 )_close(hFile);
  return  0 ;
}
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026039
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное человеческое спасибо за код!

Скажите, а какими структурами можно оперировать, чтобы работать с этим binary(1000) на уровне C++? Например, пробразование к byte(1000) ничего не испортит?
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026084
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsidОгромное человеческое спасибо за код!

Скажите, а какими структурами можно оперировать, чтобы работать с этим binary(1000) на уровне C++?
Например, пробразование к byte(1000) ничего не испортит?

Так что-ли ?

Код: 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.
    if(v.vt != VT_EMPTY){
//      hFile = _open("c:\\temp\\img.img", _O_BINARY | _O_CREAT | _O_TRUNC |_O_WRONLY,_S_IWRITE);
//      psa = v.parray;
//      SafeArrayAccessData(psa, (void HUGEP**)&ptr);
//      _write(hFile, ptr, psa->rgsabound->cElements);
//      SafeArrayUnaccessData(psa);

      long a( 0 ), b( 0 );

      psa = v.parray;
      SafeArrayAccessData(psa, (void HUGEP**)&ptr);

      // 1
      unsigned char * c = new unsigned char[psa->rgsabound->cElements];
      memcpy(c, ptr, psa->rgsabound->cElements);
      for(unsigned long i( 0 ); i < psa->rgsabound->cElements; ++i) a += (long)c[i];
      std::cout << " A =  " << a << std::endl;
      delete [] c;
      
      //2
      for(unsigned long i( 0 ); i < psa->rgsabound->cElements; ++i) b += (long)ptr[i];
      std::cout << " B =  " << b << std::endl;
      
      SafeArrayUnaccessData(psa);
    }
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026219
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну примерно так, да... ;) Еще раз спасибо!

А если я передаю binary(1000) значение в процедуру! То есть уже не Output!

Пройдет ли вариант сопировать unsigned char* при помощи SafeArrayAccessData в v->parray? Чему тогда приравнивать v->vt? VT_ARRAY?
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026291
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsidНу примерно так, да... ;) Еще раз спасибо!

А если я передаю binary(1000) значение в процедуру! То есть уже не Output!

Пройдет ли вариант сопировать unsigned char* при помощи SafeArrayAccessData в v->parray? Чему тогда приравнивать v->vt? VT_ARRAY?

Типа этого

Код: 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.
  long ret, size, hFile( 0 ); SAFEARRAY  *psa; char HUGEP *ptr; _variant_t v;

...

    pars->Append(cmd->CreateParameter("@IMG", adVarBinary, adParamInput,        1 ,""));

    hFile = _open("c:\\winnt\\setupapi.log", _O_BINARY | _O_RDONLY, _S_IREAD);
    size = _lseek(hFile,  0 ,  2 ); _lseek(hFile,  0 ,  0 );

    psa = SafeArrayCreateVector(VT_UI1,  0 , size);
    SafeArrayAccessData(psa, (void HUGEP**)&ptr);

    size = _read(hFile, ptr, size);
   // или копирование, например memset в ptr

    SafeArrayUnaccessData(psa);

    v.vt = VT_ARRAY | VT_I1; v.parray = psa;
    pars->Item[1L]->Size  = size;
    pars->Item[1L]->Value = v;
    cmd->Execute( 0 , 0 ,adOptionUnspecified);

    SafeArrayDestroy(psa);
...
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026306
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy
// или копирование, например memset в ptr


memcpy конечно.
Для binary(xxx) не проверял. У меня работает для типа image
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33026502
Alexsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер! То, что надо! Спасибо!..
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Доступ к Binary OUTPUT полю через ADO
    #33764107
Фотография FmDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё одна большая просьба, показать как можно положить данные в MSSQL поле типа image. Есть переменная BYTE szTxt[1024];
Пытаюсь работать с ней в запросе, передавая её в качестве параметра. Ничего путного не получается

spParam = spCmd->CreateParameter("@param", ADODB::adBinary, ADODB::adParamInput, 1024, ??????<что здесь корректно поставить?>));

Большое спасибо.
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33764400
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что непонятно в приведенных выше примерах ?
...
Рейтинг: 0 / 0
Доступ к Binary OUTPUT полю через ADO
    #33767229
Фотография FmDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ZrenBy

Большое спасибо, всё понял.

Привет Костроме. Город моего детства :-)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Доступ к Binary OUTPUT полю через ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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