使用ADO将BLOB数据写入SQL Server数据库

时间:2009-12-22 23:09:50

标签: c++ ado

我需要将BLOB写入SQL Server数据库中的varbinary列。听起来很简单,除了我必须用C ++做。我一直在使用ADO进行数据库操作(第一个问题:这是使用的最佳技术吗?)所以我得到了_Stream对象,并创建了一个记录集对象,其余的操作从那里开始。如果有人可以提供一个如何准确执行这个看似简单的操作的样本,那就太棒了!我的二进制数据存储在unsigned char数组中。这是我从互联网上发现的很少的东西拼凑而来的代码:

    _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();

1 个答案:

答案 0 :(得分:2)

就这种情况而言,ADO是最好的技术......我不太确定。我个人认为在C ++中使用ADO是一个痛苦的过程。但如果你需要的话,这是非常通用的。我没有使用流来在该级别写入数据的工作示例(尽管有点讽刺的是,我有使用OLE DB级别的流编写的代码。但是,这会增加疼痛级别很多次)。

但是,如果你的数据总是被完全加载到内存中,我认为使用AppendChunk会更简单:

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