tags:

views:

128

answers:

1

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  A: 

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" );
Mark Wilkins
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.
Aaron Cook