Announcement

Collapse
No announcement yet.

Blob und Access-Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Blob und Access-Datenbank

    hi,
    <br>ich lege mir mal wieder die Karten.
    <br>Ich benutze den CBuilder 5.0 Professionell und die Datenzugriffs-Komponenten, die ADO-Komponenten stehen mir nicht zur Verfügung.
    <br>Bilder als Blob in eine Interbase-Datenbank zu schreiben und auszulesen ist gar kein Problem.
    <br>Jetzt versuche ich dies mit einer Access-Datenbank und mein Wissen recht nicht aus.
    <br>Zum Schreiben benutze ich folgende Methode
    <pre>
    if (OpenPictureDialog2->Execute())
    {
    TBlobStream *aBS = new TBlobStream( Query2PER_BILD , bmWrite);
    try
    {
    aBS->Seek( 0, soFromBeginning );
    TFileStream *aFS = new TFileStream( OpenPictureDialog2->FileName,
    fmOpenRead || fmShareDenyWrite );
    try
    {
    aBS->CopyFrom( aBS, aBS->Size );
    }
    __finally
    {
    delete aFS;
    }
    }
    __finally
    {
    delete aBS;
    }
    }
    </pre>
    <br>Danach wird kein Bild mehr in der DBImage-Komponente angezeigt.
    <br>Beim Versuch mit dem folgenden Code ist der obere Teil des Bildes im DBImage immer abgeschnitten.
    <pre>
    TBlobField *aBF = dynamic_cast <TBlobField*>(Query2->FieldByName( "PER_BILD" ));
    if ( aBF == NULL ) return;
    aBF->LoadFromFile( OpenPictureDialog2->FileName );
    </pre>

    mfg & thx
    Torsten

  • #2
    Torsten,

    sieht mir nach Tipp-Fehler aus:
    <pre>aBS->CopyFrom( aBS, aBS->Size );</pre>
    kopiert sich irgendwie in sich selbst rein.

    Schau auch mal da rein, vielleicht hilft es Dir irgend wie weiter: <a href="/webx?50@@.1dd057a8">Andre Driessen "Grafik erstellen" 15.09.2003 09:47</a>

    Gruß,<br>
    Ja

    Comment


    • #3
      hi,
      <br>der Tippfehler ist ja mal wieder peinlich, grrr.
      <br>mit dem Beitrag habe ich auch schon rumgekämpft und kein Ergebnis erzielt.
      <br>Okay, das Bild wird jetzt schön in den Stream eingelesen und angezeigt.
      <br>Nach einem Öffnen und Schliessen meiner Query ist wieder der obere Bildteil verschwunden.
      <br>Im Forum habe ich dazu gelesen, dass bei Access ein OleObjekt benutzt wird und ein Header von 78 Byte vorgeschaltet ist.
      Daher nehme ich die Vermutung, dass ich die ersten 78 Byte nicht auslesen darf und änderte einen Delphi-Text ab und produziere damit einen StreamRead Fehler.
      <pre>
      TBlobStream *aBS;

      if (!(Query2->State == dsBrowse)) exit;

      aBS = new TBlobStream(Query2per_bild, bmRead);
      try
      {
      aBS->Truncate();
      aBS->Seek(78, soFromBeginning);
      DBImage2->Picture->Graphic->LoadFromStream( aBS );
      }
      __finally
      {
      delete aBS;
      }
      </pre>
      <br>
      <br>thx
      <br>Torste

      Comment


      • #4
        Torsten,
        also wenn ich die CB-Hilfe richtig verstehe, leert TBlobStream::Truncate den Stream ab der aktuellen Position. Wenn Dein Stream aBS also nach der Erzeugung auf den Anfang positioniert ist (ist das so?), werden alle Daten gelöscht und das folgende Seek greift in einen nicht existenten Speicherbereich.

        Was die halben bilder betrifft: hast Du mal untersucht, ob die Bildgröße eine Rolle spielt, ob der Effekt speziell auch dann auftritt, wenn Du sehr kleine Bilder verwendest?

        Die Zeile "DBImage2->..." verstehe ich nicht. Eigentlich sollte das Feld den Grafik-Inhalt selbst darstellen - dafür ist es ja da.

        Gruß,<br>
        Ja

        Comment


        • #5
          hi,
          <br>ich hatte rausgelesen, dass man mit Truncate den Stream leeren kann und dann wieder neu füllt.
          <br>Aber ganz unten stand dann auch die Ausschlussklausel nicht bei geöffnet im Modus bmRead verwenden.
          <br>
          <br>manchmal sollte man einfach hinaus gehen, wenn nichts mehr geht. Ja, dieses Phänomen mit <br>den halben Bildern tritt erst ab 100 kByte auf.
          Ich habe es dann mit einem größeren Blob-Cache <br>in der BDE versucht, mit negativen Erfolg.
          <br>Aber welche Möglichkeiten gibt es da noch?
          <br>Kann man ein Blob Stück für Stück in eine Datenbank schreiben?
          <br>
          <br>Den Quelltext aus meinem letzten Kommentar kann man sich ganz schenken. Funktioniert auch ohne diese Zeilen.
          <br>
          <br>
          <br>thx
          <br>Torste

          Comment


          • #6
            Torsten,

            >manchmal sollte man einfach hinaus gehen...
            ... und Tomaten oder Schafe züchten - genau!

            Hast Du mal die TBlobField-Variante ausprobiert ?

            <pre>
            if (OpenPictureDlg->Execute() == false) return;
            TBlobField* blobField = dynamic_cast <TBlobField*> (Table->FieldByName("PICTURE"));
            if (blobField == NULL) return;
            Table->Edit();
            blobField->LoadFromFile(OpenPictureDlg->FileName);
            Table->Post();
            </pre>

            Gruß,
            Ja

            Comment


            • #7
              hi,

              diese Zeilen kenn ich und habe ich zuerst verwendet. Ich hatte damit das gleiche Problem. Ich denke dies liegt an der Access-Datenbank, aber weiß nichtwo.

              thx
              Torste

              Comment


              • #8
                Torsten,

                > Ich habe es dann mit einem größeren Blob-Cache
                in der BDE versucht, mit negativen Erfolg.

                jeder Datenbank-Alias hat einen Parameter "BLOB SIZE". Hast Du mal daran herumgespielt?

                Gruß,
                Ja

                Comment


                • #9
                  Jan,
                  <br>
                  <br>der Datenbank-Alias für eine Access-Datenbank hat keinen Parameter "BLOB SIZE".
                  <br>Damit habe ich schon mal einer Interbase-Datenbank auf die Sprünge geholfen.
                  <br>
                  <br>
                  Gruß, Torste

                  Comment

                  Working...
                  X