//pass blob to oracle stored procedure
//build by masterz 20050227 with VC2003, Windows 2003, Oracle 10g.
//The tip: user oledb provider string!
#include "stdafx.h "
#import "C:/PROGRA~1/COMMON~1/System/ado/msado15.dll " rename( "EOF ", "adoEOF " )
struct InitOle
{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;
void PrintProviderError(ADODB::_ConnectionPtr pConnection);
void print_properties(LPCTSTR name, ADODB::PropertiesPtr Properties)
{
long prop_count = Properties-> GetCount();
printf( "%s property count = %d/n ",name,prop_count);
for(long i=0;i <prop_count;i++)
{
printf( "%s property [%d]:%s/n ",name,i,(LPCSTR)Properties-> GetItem(i)-> Name);
}
}
int main(int argc, char* argv[])
{
ADODB::_ConnectionPtr Conn1;
ADODB::_CommandPtr Cmd1;
ADODB::_ParameterPtr oldParam= NULL;
ADODB::_ParameterPtr inParam=NULL;
ADODB::_ParameterPtr blobParam=NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrConnect= "Provider=OraOLEDB.Oracle;Data Source=orcl;User Id=system;Password=oracle; ";
_bstr_t bstrCreate ( "CREATE OR REPLACE PROCEDURE TEST_BLOB ( "
"p_USERNAME in CHAR,p_OLD in CHAR,p_PHOTO in BLOB default empty_blob() ) "
"as "
"begin "
"begin "
"insert into USERPHOTO( "
"USERNAME,OLD,PHOTO) "
"values (p_USERNAME,p_OLD,p_PHOTO); "
"commit; "
"end; "
"end TEST_BLOB; " );
_bstr_t bstrSP( "{CALL TEST_BLOB(?,?,?)} " );
try
{
_variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
ADODB::_StreamPtr adostream;
adostream.CreateInstance(_T( "ADODB.Stream "));
adostream-> Type = ADODB::adTypeBinary;
adostream-> Open(varOptional,ADODB::adModeUnknown, ADODB::adOpenStreamUnspecified, _T( " "), _T( " "));
adostream-> LoadFromFile( "C://masterz//app.zip ");
_variant_t vReadTo = adostream-> Read(ADODB::adReadAll);
long blob_size = adostream-> GetSize();
adostream-> Close();
_bstr_t bstrEmpty;
Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
Conn1-> ConnectionString = bstrConnect;
Conn1-> Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
Conn1-> Execute(bstrCreate,NULL,ADODB::adCmdText);
Cmd1-> ActiveConnection = Conn1;
Cmd1-> CommandText = bstrSP;
Cmd1-> CommandType = ADODB::adCmdText;
Conn1-> Properties-> Refresh();
inParam = Cmd1-> CreateParameter(_bstr_t( "p_USERNAME "),ADODB::adChar,ADODB::adParamInput,2,_variant_t( "a " ));
Cmd1-> Parameters-> Append(inParam);
oldParam = Cmd1-> CreateParameter(_bstr_t( "p_OLD "),ADODB::adChar,ADODB::adParamInput,4,_variant_t( "yes " ));
Cmd1-> Parameters-> Append(oldParam);
blobParam = Cmd1-> CreateParameter(_bstr_t( "p_PHOTO "),ADODB::adLongVarBinary,ADODB::adParamInput,blob_size,vReadTo);
Cmd1-> Parameters-> Append(blobParam);
Cmd1-> Properties-> Refresh();
print_properties( "Cmd1 ",Cmd1-> Properties);
ADODB::PropertyPtr prop = Cmd1-> Properties-> GetItem( "SPPrmsLOB ");
prop-> PutValue(_variant_t(VARIANT_TRUE,VT_BOOL)) ;
Cmd1-> Execute(NULL,NULL,ADODB::adExecuteNoRecords);
prop = Cmd1-> Properties-> GetItem( "SPPrmsLOB ");
prop-> PutValue(_variant_t(VARIANT_FALSE,VT_BOOL)) ;
Conn1-> Close();
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf( "/nCOM error occurred, Source : %s /n Description : %s /n ",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
PrintProviderError(Conn1);
}
printf( "/nprogram end/n ");
return 0;
}
VOID PrintProviderError(ADODB::_ConnectionPtr pConnection)
{
ADODB::ErrorPtr pErr = NULL;
long nCount = 0;
long i = 0;
if( (pConnection-> Errors-> Count) > 0)
{
nCount = pConnection-> Errors-> Count;
for(i = 0; i < nCount; i++)
{
pErr = pConnection-> Errors-> GetItem(i);
printf( "/n/t Error number: %x/t%s ", pErr-> Number, (LPCSTR)pErr-> Description);
}
}
}
pass blob to oracle stored procedure
最新推荐文章于 2024-08-31 20:14:10 发布