Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Доступ к Binary OUTPUT полю через ADO / 14 сообщений из 14, страница 1 из 1
17.04.2005, 19:15
    #33020033
Alexsid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
Столкнулся с проблемой, никак не могу разрешить.
Есть хранимая процедура на 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
18.04.2005, 09:36
    #33020348
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
Встречный вапрос: что ты хотел этим сказать ?

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

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

Скажите, а какими структурами можно оперировать, чтобы работать с этим binary(1000) на уровне C++? Например, пробразование к byte(1000) ничего не испортит?
...
Рейтинг: 0 / 0
20.04.2005, 18:09
    #33026084
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
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
20.04.2005, 18:46
    #33026219
Alexsid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
Ну примерно так, да... ;) Еще раз спасибо!

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

Пройдет ли вариант сопировать unsigned char* при помощи SafeArrayAccessData в v->parray? Чему тогда приравнивать v->vt? VT_ARRAY?
...
Рейтинг: 0 / 0
20.04.2005, 19:10
    #33026291
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
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
20.04.2005, 19:13
    #33026306
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к Binary OUTPUT полю через ADO
ZrenBy
// или копирование, например memset в ptr


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

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

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

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

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


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