Binärdaten (Bild) in .mdb per ADOQuery speichern geht nicht...



  • Hallo, ich möchte gerne ein Bild in meine Access Datenbank speichern.

    Dazu öffne ich das Bild zuvor und lade die Binärdaten in ein

    char. Das klappt alles wunderbar, habe mir diese Bild schonmal mittels ServerSocket im Browser ausgegeben.

    Dieses char "wandle" bzw. schreibe ich nun mittels einer for Schleife in ein AnsiString.

    for(int b=0; b<=iFileLength; b++)
       {
          as_bild=as_bild+FileBytes[b];
       }
    

    nun möchte ich dieses Bild in die DB abspeichern, und dann kommt es zu einer Fehlermeldung.
    Das Feld der Tabelle wo das Bild geseichert werden soll ist ein OLE_objekt.

    Fehlermeldung:

    Syntaxfehler in Zeichenfolge "BMŽù".

    Wenn mir da einer Helfen könnte, wäre ich sehr Dankbar.

    Die gleicher Fehlermeldung kommt auch, wenn kein Bild ausgewählt wurde und ich im AnsiString "NO PIC" drinn stehen habe

    hier noch das query:

    ado_save->SQL->Clear(); //Löschen der SQL Strings
    
    ado_save->SQL->Add("INSERT INTO tab_klasse(name,vorname,bild,klasse)");
    ado_save->SQL->Add ("VALUES'"+as_name+"','"+as_vorname+"','"+as_bild+"','"+as_klasse+"')");
    
    ado_save->ExecSQL(); //INSERT Befehl ausführen
    

    Vielen Dank gruß Thorsten



  • Naja, ein Bild ist kein String. Nur weil ein Textprogramm es als lustige Zeichenfolge darstellt, heißt das nicht, dass man es wie nen Text behandeln kann. Und AnsiString ist ohnehin schlecht, da dort der String z.B. beim ersten \0 aufhört. (Das ist jetzt wohl der einzige Satz in meinem Post, der wirklich was aussagt... 😞 )

    Um Bilder in Datenbanken zu verwenden, nutzt man normalerweise Blob-Felder...



  • weiß jetzt nicht ob das so richtig ist, wollte das dann mit einem TBlobField ausprobieren also so:

    TBlobField *blo_bild = new TBlobField(this);
    blo_bild->LoadFromFile(gl_picPath);
    

    Nur haut er mir gleich wieder beim LoadFromFile eine Fehlermeldung um die Ohren

    Zugriffsverletzung an Adresse...

    Wie müsste ich dann eigentlich den SQL String umändern?

    ado_save->SQL->Add("VALUES ('"+as_name+"','"+as_vorname+"','"+ blo_bild +"','"+as_klasse+"')");
    

    hier mekkert er dann:
    [C++ Fehler] tsserver_p1_u4.cpp(182): E2094 'operator+' ist im Typ 'AnsiString' für Argumente des Typs 'TBlobField *' nicht implementiert.



  • TBlobField() will nicht das Parent-Form sondern ein DataSet. Irgendwie musst du ja ne Verbindung zur Datenbank haben (denke ich)

    Was den SQL-Befehl angeht, hab ich auch keine Ahnung. Würde auf die Schnelle sagen, dass du blo_bild->AsString verwenden könntest, aber irgendwie würde das wieder zum selben Problem wie vorher führen. 😞



  • beim SQL-Befehl am besten Parameter verwenden

    ado_save->SQL->Add("VALUES (:name,:vorname,:bild,:klasse)");
    ado_save->Parameters->ParamByName("name")->Value = as_name;
    ado_save->Parameters->ParamByName("vorname")->Value = as_vorname;
    ado_save->Parameters->ParamByName("bild")->Value = blo_bild;
    ado_save->Parameters->ParamByName("klasse")->Value = as_klasse;
    

    bei ADO-Komponenten muss das Parameters stehen, bei anderen fällt das weg

    Value setzt den Typ der Variable automatisch



  • ich habe weiteres auspobiert, auch den sql string mittels adocommand zu übergeben, nur ich bekomme das bild einfach nicht in die DB geschrieben. weder als char, so wie man die datei ausliest, noch als ansistring und mit dem Blob macht er ja die fehlermeldung die oben steht. sollte man nun lieber darauf umsteigen, den pfad der bilder abzuspeichern? nur es gibt ja programme, die bmp dateien in db's abspeichern können. also muss das doch irgendwie funktionieren. weiß da nicht mehr weiter...´

    [edit]: es wird von der Zeichenette: BMŽù immer nur das B abgespeichert ...



  • hallo, habe lang herumgesucht bis es geklappt hat 🙂 access mach da ein bischen probleme 😞 das feld in access muss als ole deklariert werden und dann sollte es mit dem nachfolgenden code funzen!

    TJPEGImage *bildjpeg = new TJPEGImage;
    TMemoryStream *bild = new TMemoryStream;

    Bild in die Datenbank rein:

    Image2->Picture->Graphic->SaveToStream(bild);
    Query1->ParamByName("logo")->DataType=ftBlob; <-kann man sich sparen da in load from stream
    Query1->ParamByName("logo")->LoadFromStream(bild,ftBlob);

    Bild aus der Datenbank raus:

    bildjpeg->Assign(Query1->FieldByName("logo"));
    Image1->Picture->Assign(bildjpeg);

    gruß
    boris



  • WOW! hört sich auf jeden Fall gut an, werd es mal bei gelegenheit ausprobieren DANKE!


Anmelden zum Antworten