2009-12-22 123 views
2

我需要将BLOB写入SQL Server数据库中的varbinary列。听起来很容易,但我必须用C++来完成。我一直在使用ADO进行数据库操作(第一个问题:这是否是最好的技术?)所以我得到了_Stream对象,并创建了一个记录集对象,其余的操作都从这里开始。如果有人能够提供一个如何执行这个看似简单的操作的样本,那将是非常棒的!我的二进制数据存储在一个unsigned char数组中。下面是我从什么小我发现在互联网上缝合在一起的codenstein:使用ADO将BLOB数据写入SQL Server数据库

_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是在这种情况下,最好的技术......我真的不知道。我个人认为从C++使用ADO是一个痛苦的过程。但如果你需要的话,它是非常通用的。我没有一个使用流在该级别写入数据的工作示例(虽然有点讽刺的是,我有我在OLE DB级别使用流编写的代码,但是这会增加痛苦级别很多次)。

如果,但是,您的数据总是会被加载完全在内存中,我认为使用AppendChunk的将是一个更简单的途径:

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

容易得多谢谢!像魅力一样工作!对于那些在那里挣扎着的人来说,作为最后一步,我必须使用包含SafeArray的VARIANT来存储我的数据并将其传递给AppendChunk。 – 2009-12-23 18:35:10

相关问题