Bild mit C++ in eine IBDatenbank??



  • Hallo erstmal,

    Ich habe in einer Tabelle ein Blob Feld. In dieses möchte ich ein Bild für jeden Datensatz einfügen. Ich habe mit der Suchen-Funktion hier im Forum nichts brauchbares gefunden. Kann mir einer sagen wie das geht, oder einen Tip geben.



  • Kann es den sein, dass sich hier keiner mit Blob-Feldern auskennt?? Ich kann nicht glauben, dass das noch keiner versucht hat. 😞 Ich weiss mitlerweile das mann nicht direkt in dieses Feld schreiben kann, man muß das Image erst in einen Stream umwandeln. 😕 Ist denn da Draussen keiner, der das gleiche Problem hat? 😕 Eventuell können wir das dann zusammen Lösen. 😉



  • Nun ja, falls Du den BCB verwendest, sieh Dir mal TBLOBStream an, wie das allerdings in reinem C++ geht...

    Die generelle Logik dahinter ist die Daten in einen Stream zu schreiben und diesen Stream über eine geeignete Methode der DB-Zugriffskomponenten in die DB zu schreiben.



  • Ich ich verwende den BCB 6. Ich schau mal was ich da finde. Danke erstmal.



  • Also ich hab volgendes gefunden:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TStream *Stream2;
    
      try
      {
        Stream2 = IBClientDataSet1->CreateBlobStream(IBClientDataSet1->FieldByName("Bild"), bmReadWrite);
        try
        {
    
          IBClientDataSet1->Post();
        }
        __finally
        {
    
          delete Stream2;
        }
      }
    }
    

    Aber wie bekomme ich das Image von der Batei in das stream??
    Es muss da was wie...

    Stream2 = LoadFromFile(OpenPictureDialog1);
    

    ... geben???



  • Das Bild in eine entsprechende Komponente laden (TBitmap, TJPEGImage) und dann die Methode SaveToStream() verwenden.



  • Ich bekomme beim Deklarieren des TBitmap Objektes volgenden Fehler:

    "E2015 Mehrdeutigkeit zwischen 'TBitmap' und 'Windows::TBitmap' "

    wie mach ich das eindeutig?



  • Es gibt 2 Versionen von TBitmap (einmal in Graphics und einmal in Windows).

    Du benötigst Graphics::TBitmap. (Du kannst auch den Namespace vorgeben)



  • Also das hat der Compiler gefressen:

    TStream *Stream2;
      Graphics::TBitmap *Bild;
      Bild=new Graphics::TBitmap;
    
        Stream2 = IBDataSet1->CreateBlobStream(IBDataSet1->FieldByName("Bild"), bmReadWrite);
        Bild->LoadFromFile(OpenPictureDialog1->FileName);
        Bild->SaveToStream(Stream2);
        IBClientDataSet1->Post();
        delete Stream2;
    

    Nur Beim Bild laden sagt der, dass das nicht geht.

    Bild->LoadFromFile(OpenPictureDialog1->FileName);
    

    Was hab ich falsch gemacht??



  • Also ich habe vergessen den "OpenPictureDialog1->Execute();" aufzurufen.
    Aber nun bekomme ich die Meldung, dass die DB nicht im Bearbeitungsmodus ist.



  • Also jetzt hab ich es!!! 😃

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TStream *Stream2;
      Graphics::TBitmap *Bild;
      Bild=new Graphics::TBitmap;
    
        IBDataSet1->Edit();
        Stream2 = IBDataSet1->CreateBlobStream(IBDataSet1->FieldByName("Bild"), bmReadWrite);
        OpenPictureDialog1->Execute();
        Bild->LoadFromFile(OpenPictureDialog1->FileName);
        Bild->SaveToStream(Stream2);
        IBDataSet1->Post();
        IBDataSet1->Close();
        IBDataSet1->Open();
        delete Stream2;
    
    }
    

    Danke für deine Hilfe.


Anmelden zum Antworten