Problem ein JPG in einer Datenbank zu speichern



  • Hallo zusammen, ich möchte ein JPG in eine Datenbank speichern, bekomm das aber einfach nicht hin.
    Habe folgendes versucht:

    ADOQuery1->Close();
        ADOQuery1->SQL->Add("select bild from bilder where id = '1'");
        ADOQuery1->Open();
    
        ADOQuery1->Edit();
        TMemoryStream *ms = new TMemoryStream ();
        ms->LoadFromFile("1.jpg");
          TStream *Stream2;
    
        Stream2 = ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("Bild"), bmWrite);
        Stream2->CopyFrom(ms, ms->Size);
    
        ADOQuery1->Post();
        }
    

    Bild ist vom Typ OLE-Objekt. Habe die Datenbank in Access erstellt.

    Kann mir vielleicht einer helfen?

    Danke im vorraus
    mfg



  • Was genau ist denn dein Problem? Ist kein Bild in der Datenbank?
    Schreib doch mal nach dem lesen des Bildes

    ms->Position = 0;
    

    Damit wird die Position des Lesestreams auf den Anfang zurückgesetzt.



  • Hab ich auch schon probiert, funzt aber auch nicht 😞

    Wenn ich das z.b. danach mach ist Stream3 leer.
    Es kommt also kein Bild in der Datenbank an.

    TStream *Stream3 = ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("Bild"), bmRead);
    
        delete Stream2;
    

    Das hab ich auchmal probiert, geht aber auch nicht:

    ADOQuery1->Close();
        ADOQuery1->SQL->Add("select bild from bilder where patid = '1'");
        ADOQuery1->Open();
    
        ADOQuery1->Edit();
        TMemoryStream *ms = new TMemoryStream ();
        ms->LoadFromFile("1.jpg");
          TStream *Stream2;
    
        Stream2 = ADOQuery1->CreateBlobStream(ADOQuery1->Fields->Fields[0], bmWrite);
        Stream2->CopyFrom(ms, ms->Size);
    
        ADOQuery1->Post();
    


  • Ersetze mal

    Stream2->CopyFrom(ms, ms->Size);
    

    durch

    Stream2->CopyFrom(ms, 0);
    

    Wo ist denn der Unterschied von deinem letzten Post zum Ersten?



  • hier mal ein Beispiel zum Speichern:

    TMemoryStream *Stream = new TMemoryStream();
    Stream->LoadFromFile("1.jpg");
    Stream->Position = 0;
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("update bilder set bild = :bild where patid = '1'");
    ADOQuery1->Parameters->ParamByName("bild")->DataType = ftBlob;
    ADOQuery1->Parameters->ParamByName("bild")->LoadFromStream(Stream,ftBlob);
    ADOQuery1->ExecSQL();
    

    und hier zum Laden:

    TMemoryStream *Stream = new TMemoryStream();
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select bild from bilder where patid = '1'");
    ADOQuery1->Open();
    static_cast<TBlobField*>(ADOQuery1->FieldByName("bild"))->SaveToStream(Stream);
    Stream->Position = 0;
    

    noch einen Tip: nimm statt ADOQuery lieber ADOCommand



  • Wohuu 🙂
    Hat super geklappt, danke Linnea 👍

    Falls nochmal welche dieses Problem haben:

    mfg



  • Falls nochmal welche dieses Problem haben:

    Ups, sollte sich auf "Parameters->" beziehen, aber da wars schon editiert 🙂

    Welche Vorteile hat den Command?


Anmelden zum Antworten