MS ADO, Record + Stream
От: FamiLom Беларусь  
Дата: 17.05.10 09:40
Оценка:
Добрый день.

Используется 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. В чем может быть дело?
Спасибо.
ado record stream
Re: MS ADO, Record + Stream
От: kvasya  
Дата: 17.05.10 19:34
Оценка:
Здравствуйте, 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'а работать с блобом, не загружая его целиком в память клиента (используя смещение внутри блоба)?
FL>2) Если да, то как связать stream с record'ом? Сейчас сделано так:

1) Лучше будет, если сразу вернуть нужную часть данных. Но не резать их на клиенте.
2) Stream, ведет себя как поток. Читает последовательно до упора. Соответственно резать надо самому.

Не слышал, чтобы можно было резать "по месту" данные столбца. Но, что запросил — то получил. Дальше делай, что хочешь.
Re: MS ADO, Record + Stream
От: baranovda Российская Империя  
Дата: 17.05.10 20:04
Оценка:
Здравствуйте, 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, то никак, т.к. они манипулируют указателями на позицию в потоке и не привязаны к текущей записи курсора
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.