2

I need to write a BLOB to a varbinary column in a SQL Server database. Sounds easy except that I have to do it in C++. I've been using ADO for the database operations (First question: is this the best technology to use?) So i've got the _Stream object, and a record set object created and the rest of the operation falls apart from there. If someone could provide a sample of how exactly to perform this seemingly simple operation that would be great!. My binary data is stored in a unsigned char array. Here is the codenstein that i've stitched together from what little I found on the internet:

    _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 Answer 1

2

As far as ADO being the best technology in this case ... I'm not really sure. I personally think using ADO from C++ is a painful process. But it is pretty generic if you need that. I don't have a working example of using streams to write data at that level (although, somewhat ironically, I have code that I wrote using streams at the OLE DB level. However, that increases the pain level many times).

If, though, your data is always going to be loaded entirely in memory, I think using AppendChunk would be a simpler route:

ret = updSet.GetInterfacePtr()->Fields->
               Item["Chunk"]->AppendChunk( L"some data" );
Sign up to request clarification or add additional context in comments.

1 Comment

So much easier thank you! Worked like a charm! For those of you out there struggling with this, as a final step I had to use a VARIANT containing a SafeArray to store my data in and pass that in the call to AppendChunk.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.