Необходимо передать в поле типа image, серверной БД, данные в бинарном виде объемом более 8кб. Менее 8кб получается передавать, а с большими объемами проблема - выдается сообщение "String data, right truncation". Перепробовал, как мне кажется, уже все. Пытался подставлять adBinary, adVarBinary, adLongVarBinary, но результат один и тот же - сообщение "String data, right truncation". подскажите пожалуйста как же быть? select @@VERSION вернул следующее: Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright © 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3) код хранимой процедуры следующий: Код | set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO
ALTER PROCEDURE [dbo].[GUI_AddTask] ( @did uniqueidentifier, @type int=0, @dscr varchar(4000)=null, @data image=null) AS
set nocount on
declare @ptask uniqueidentifier declare @taskid uniqueidentifier declare @cmd varchar(30) declare @now datetime set @now=getdate() ... end
|
код функции инициализации команды: Код | bool CSqlADO::Init_GUI_AddTask() { try { m_CommandPtr_GUI_AddTask = NULL; if ( FAILED( m_CommandPtr_GUI_AddTask.CreateInstance( __uuidof(Command) ) ) ) return false;
_bstr_t strExecProc( "GUI_AddTask" ); m_CommandPtr_GUI_AddTask->CommandText = strExecProc; m_CommandPtr_GUI_AddTask->CommandType = adCmdStoredProc; m_CommandPtr_GUI_AddTask->CommandTimeout = 30; m_CommandPtr_GUI_AddTask->Prepared = true;
m_CommandPtr_GUI_AddTask->CreateParameter( "@did", adGUID, adParamInput, 50 ); m_CommandPtr_GUI_AddTask->CreateParameter( "@type", adInteger, adParamInput, 50 ); m_CommandPtr_GUI_AddTask->CreateParameter( "@dscr", adBSTR, adParamInput, 50 ); m_CommandPtr_GUI_AddTask->CreateParameter( "@data", adBinary, adParamInput, -1); return true; } catch(_com_error e) { m_sqlLastError=BSTRToQStr(e.Description()); emit result(m_sqlLastError); } return false; }
|
код вызова хранимой процедуры: Код | _RecordsetPtr CSqlADO::exec_GUI_AddTask(QString strDID, int type, QString strdsrc, std::string strTLVData) { try { m_CommandPtr_GUI_AddTask->ActiveConnection = m_ConnectionPtr;
_variant_t vtDID( "{" + QStrToBSTR(strDID) + "}"); _variant_t vttype( type ); _variant_t vtdsrc( QStrToBSTR(strdsrc)); _variant_t vtdata = DataTo_variant_t((byte*)strTLVData.c_str(),strTLVData.length());
_variant_t Index; Index.vt = VT_I2; Index.iVal = 1; m_CommandPtr_GUI_AddTask->GetParameters()->GetItem(Index)->PutValue( vtDID ); Index.iVal = 2; m_CommandPtr_GUI_AddTask->GetParameters()->GetItem(Index)->PutValue( vttype ); Index.iVal = 3; m_CommandPtr_GUI_AddTask->GetParameters()->GetItem(Index)->PutValue( vtdsrc ); Index.iVal = 4; m_CommandPtr_GUI_AddTask->GetParameters()->GetItem(Index)->PutValue( vtdata );
_RecordsetPtr pRecordSetExecuteRes; try { pRecordSetExecuteRes = m_CommandPtr_GUI_AddTask->Execute( 0, 0, adCmdStoredProc); // здесь выскакивает "String data, right truncation" return pRecordSetExecuteRes; } catch(_com_error e) { m_sqlLastError=BSTRToQStr(e.Description()); emit result(m_sqlLastError); return _RecordsetPtr(); } return pRecordSetExecuteRes; } catch(_com_error e) { m_sqlLastError=BSTRToQStr(e.Description()); emit result(m_sqlLastError); } return NULL; }
|
|