2009-12-22 1 views
2

Мне нужно записать BLOB в столбец varbinary в базе данных SQL Server. Звучит просто, за исключением того, что я должен сделать это на C++. Я использую ADO для операций с базой данных (первый вопрос: это лучшая технология для использования?) Итак, у меня есть объект _Stream и созданный объект набора записей, а остальная часть операции отделена от него. Если кто-то может предоставить образец того, как именно выполнить эту, казалось бы, простое действие, которое было бы здорово !. Мои двоичные данные хранятся в массиве unsigned char. Вот codenstein, что я уже сшит из того, что мало я нашел в интернете:Запись данных BLOB в базу данных SQL Server с использованием ADO

_RecordsetPtr updSet; 
    updSet.CreateInstance(__uuidof(Recordset)); 
    updSet->Open("SELECT TOP 1 * FROM [BShldPackets] Order by ChunkId desc", 
    _conPtr.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); 

    _StreamPtr pStream ; //declare one first 
    pStream.CreateInstance(__uuidof(Stream)); //create it after 
    _variant_t varRecordset(updSet); 
    //pStream->Open(varRecordset, adModeReadWrite, adOpenStreamFromRecord, _bstr_t("n"), _bstr_t("n")); 

    _variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR); 
     pStream->Open(
         varOptional, 
         adModeUnknown, 
         adOpenStreamUnspecified, 
         _bstr_t(""), 
         _bstr_t("")); 

    _variant_t bytes(_compressStreamBuffer); 
    pStream->Write(_compressStreamBuffer); 
    updSet.GetInterfacePtr()->Fields->GetItem("Chunk")->Value = pStream->Read(1000); 
    updSet.GetInterfacePtr()->Update(); 

    pStream->Close(); 

ответ

2

Насколько ADO является лучшей технологией в этом случае ... Я не совсем уверен. Я лично думаю, что использование ADO из C++ - это болезненный процесс. Но это довольно общее, если вам это нужно. У меня нет рабочего примера использования потоков для записи данных на этом уровне (хотя, по иронии судьбы, у меня есть код, который я написал с использованием потоков на уровне OLE DB, однако это увеличивает уровень боли много раз).

Если, однако, ваши данные всегда будут загружены полностью в памяти, я думаю, с помощью AppendChunk будет проще маршрут:

ret = updSet.GetInterfacePtr()->Fields-> 
       Item["Chunk"]->AppendChunk(L"some data"); 
+0

Так гораздо проще спасибо! Работал как шарм! Для тех из вас, кто боролся с этим, в качестве последнего шага мне пришлось использовать VARIANT, содержащий SafeArray, для хранения моих данных и передачи этого в вызове AppendChunk. –

 Смежные вопросы

  • Нет связанных вопросов^_^