【问题标题】:Writing BLOB data to a SQL Server Database using ADO使用 ADO 将 BLOB 数据写入 SQL Server 数据库
【发布时间】:2009-12-22 23:09:50
【问题描述】:

我需要将 BLOB 写入 SQL Server 数据库中的 varbinary 列。听起来很简单,只是我必须在 C++ 中完成。我一直在使用 ADO 进行数据库操作(第一个问题:这是最好的技术吗?)所以我得到了 _Stream 对象,并创建了一个记录集对象,其余的操作从那里分崩离析。如果有人可以提供一个示例,说明如何准确执行这个看似简单的操作,那就太好了!我的二进制数据存储在一个无符号字符数组中。这是我从网上找到的少量资料拼凑而成的codenstein:

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

【问题讨论】:

    标签: c++ ado


    【解决方案1】:

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

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

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

    【讨论】:

    • 这样容易多了,谢谢!像魅力一样工作!对于那些为此苦苦挣扎的人,作为最后一步,我必须使用包含 SafeArray 的 VARIANT 来存储我的数据并将其传递给 AppendChunk 的调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2012-01-31
    相关资源
    最近更新 更多