Добрый день.
Используется MS ADO 2.8, Microsoft OLE DB Provider for SQL Server вместе с MS SQL Server 2008.
При работе с бинарными данными посредством AppendChunk весь блоб целиком должен быть сформирован до вызова Update на клиентской стороне даже при использовании серверных курсоров. Поскольку блобы достаточно большие, хочется при работе с ними не хранить их в памяти целиком.
Вопрос:
1) Можно ли при помощи ado stream'а работать с блобом, не загружая его целиком в память клиента (используя смещение внутри блоба)?
2) Если да, то как связать stream с record'ом? Сейчас сделано так:
ADODB::_RecordPtr pRecord;
TESTHR(pRecord.CreateInstance(__uuidof(ADODB::Record)));
_bstr_t strSQL = "SELECT ID, Data from tabData";
pRecord->Open(strSQL, _variant_t((IDispatch*) pConn),
ADODB::adModeReadWrite,
ADODB::adFailIfNotExists,
ADODB::adOpenExecuteCommand,
"", "");
ADODB::_StreamPtr pStream;
TESTHR(pStream.CreateInstance(__uuidof(ADODB::Stream)));
pStream->Type = ADODB::adTypeBinary;
pStream->Open(_variant_t((IDispatch*) pRecord),
ADODB::adModeUnknown,
ADODB::adOpenStreamFromRecord,
"", "");
Запись открывается, на открытии потока ловим DB_E_BADCOLUMNID. В чем может быть дело?
Спасибо.
Здравствуйте, FamiLom, Вы писали:
FL>Добрый день.
FL>Используется MS ADO 2.8, Microsoft OLE DB Provider for SQL Server вместе с MS SQL Server 2008.
FL>При работе с бинарными данными посредством AppendChunk весь блоб целиком должен быть сформирован до вызова Update на клиентской стороне даже при использовании серверных курсоров. Поскольку блобы достаточно большие, хочется при работе с ними не хранить их в памяти целиком.
FL>Вопрос:
FL>1) Можно ли при помощи ado stream'а работать с блобом, не загружая его целиком в память клиента (используя смещение внутри блоба)?
Добавлять можно через
AppendChunk, а манипулировать кусками блоба можно напрямую через T-SQL — см. WRITETEXT/.WRITE/UPDATETEXT
FL>2) Если да, то как связать stream с record'ом? Сейчас сделано так:
Если использовать функции T-SQL, то никак, т.к. они манипулируют указателями на позицию в потоке и не привязаны к текущей записи курсора