Speichern in Binary Feld in ADODB



  • Hallo allerseits,

    Ich möchte mit Hilfe von ADODB Daten in ein Binary-Feld auf einem SQL-Server speichern. Die Speicherung des Datensatzes gelingt mir schon gut, allerdings gibt es immer eine Exception wenn ich versuche Daten in ein Binary-Feld abzuspeichern.
    Ich habe bereits sowohl AppendChunk als auch die Verwendung eines Stream-Objekts versucht.
    Könnte mir jemand etwas Beispielcode geben, wie man sowas macht? Ich habe schon überall nach Beispielen gesucht und nur solche in VB gefunden.

    Hier mein Code (etwas unordentlich, da ich momentan alles mögliche am ausprobieren bin=:

    //#include <time.h>
    
    //#using <mscorlib.dll>
    #include <ctime>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    
    #import "C:\Programme\Gemeinsame Dateien\System\ado\msado15.dll" rename("EOF", "ADOEOF")
    
    //#include <sys/types.h>
    //#include <sys/timeb.h>
    //#include "Socket.h"
    
    using namespace std;
    
    #include <windows.h>
    //#include <ibmts.h>
    //#include <mmsystem.h>
    
    const AnzMesswerte = 50;
    typedef struct {
      unsigned int ZeitStempel;
      short Uoc, Isc, Umpp, UdcIst, UausIst, Uiso, Iiso, Tin, Tk, Tmod[5];
      short UGenIst[AnzMesswerte];
      short IGenIst[AnzMesswerte];
      unsigned int ZeitStempelEnde;
    } SatzStruct;
    
    typedef struct {
      unsigned int sec;
      unsigned short us, ms;
    } ExakteZeit;
    
    #define MaxRetries 10
    #define SatzSize sizeof(Satz)
    short retries = 0;
    unsigned int temp_int;
    unsigned int *int_ptr;
    unsigned int sec, usec, usec2;
    bool err = false;
    HRESULT hr;
    ExakteZeit Zeit;
    SatzStruct Satz;
    
    ADODB::_ConnectionPtr connection;
    ADODB::_RecordsetPtr recordset;
    ADODB::_StreamPtr mstream;
    _variant_t varChunk;
    
    void ConnectDB(void) {
    
    	CoInitialize(NULL);
    	try
    	{
    		hr = connection.CreateInstance(__uuidof(ADODB::Connection));
    		if (FAILED(hr))	throw _com_error(hr);
    		hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));
    		if (FAILED(hr))	throw _com_error(hr);
    		connection->CursorLocation = ADODB::adUseClient;
    		connection->Open(L"Provider=sqloledb;Data Source=localhost;"
    		  L"Initial Catalog=Modulmessdaten;User Id=sa;Password=<Passwort>;", L"",
    		  L"", ADODB::adConnectUnspecified);
    		recordset->Open(L"Messdaten", connection.GetInterfacePtr(),
    		  ADODB::adOpenDynamic, ADODB::adLockOptimistic, ADODB::adCmdTable);
    	}
    	catch(...)
    	{
    		std::cerr << "Connect to database Exception";
    	}
    }
    
    void DatensatzSchreiben(short ModulNr) {
    
    	try {
    		recordset->AddNew();
    		recordset->Fields->GetItem(L"Tmod4")->PutValue(varChunk);
    		recordset->Fields->GetItem(L"UGenIst")->PutValue(mstream->Read(AnzMesswerte));
    
    		recordset->Update();
    	}
    
    	catch(...)
    	{
    		std::cerr << "Update Exception";
    	}
    }
    
    int main() {
      int i=1;  
    //  int j;
      string l;
      cout << "Connecting to database\n";
      ConnectDB();
    
    hr = mstream.CreateInstance(__uuidof(ADODB::Stream));
    if (FAILED(hr))	throw _com_error(hr);
    mstream->Type = ADODB::adTypeBinary;
    
    UCHAR chData;
    SAFEARRAY FAR *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = AnzMesswerte;
    psa = SafeArrayCreate(VT_UI2,1,rgsabound);
    long index1 = 0;
    
    //Copy the data only into Field.  
    for(long index=0;index<=(AnzMesswerte-1);index++)
    {
      //Take BYTE by BYTE and advance Memory Location
      chData = Satz.UGenIst[index];
      hr = SafeArrayPutElement(psa,&index1,&chData); 
      index1++;
    }
    
    varChunk.vt = VT_ARRAY|VT_UI2;
    varChunk.parray = psa;
    
    mstream->Write(varChunk);
    
      DatensatzSchreiben(1);
      recordset->Close();
      connection->Close();
      return 0;
    
    }
    

Anmelden zum Antworten