Announcement

Collapse
No announcement yet.

Access 2000 - SELECT - Inhalt des Memo-Feldes wird einfach abgeschnitten

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

  • Access 2000 - SELECT - Inhalt des Memo-Feldes wird einfach abgeschnitten

    Hallo,

    es wird ein SELECT auf einer Tabelle durchgeführt. Hierbei sollen mehrere Felder zurückgegeben werden, unter anderem auch das Feld "Laender.Belegtext" welches vom Typ "Memo" ist.

    Es gibt nun Probleme bei der Rückgabe der Feldinhalte. Es werden nicht alle gespeicherten Textzeilen zurückgegeben, der Rest vom Text wird immer an der gleichen Stelle abgeschnitten.

    Das Problemfeld hat die Bezeichnung "Laender.Belegtext". Hier das entsprechende SQL - Script.

    <pre>
    SELECT Rechnung.RechnungsNr, Kunden.UstId AS KundenUstId, Mandanten.UstId AS MandantUstId, Laender.Inland, Laender.[EG-Land], Laender.Ausland, Laender.Belegtext AS Landtext, Zahlungsbedingungen.Text AS Zahlungstext, Laender.PrintExtArtikelInfos
    FROM (((Rechnung INNER JOIN Kunden ON Rechnung.Kunden_Id = Kunden.id) INNER JOIN Mandanten ON Rechnung.Mandant = Mandanten.Kurzname) INNER JOIN Laender ON Rechnung.Land = Laender.Land) INNER JOIN Zahlungsbedingungen ON Rechnung.Zahlungsbedingung = Zahlungsbedingungen.Bezeichnung
    WHERE (((Rechnung.RechnungsNr)= :xRechNr))
    GROUP BY Rechnung.RechnungsNr, Kunden.UstId, Mandanten.UstId, Laender.Inland, Laender.[EG-Land], Laender.Ausland, Laender.Belegtext, Zahlungsbedingungen.Text, Laender.PrintExtArtikelInfos;
    </pre>

    Das Problem tritt auch auf wenn ich das SELECT direkt auf die Tabelle "Laender" durchführe. An Group By oder Joins kann es also nicht liegen.

    Weis jemand wo der Fehler liegt oder unter welchen Umständen Memofelder einfach abgeschnitten werden ?

    Gruß
    Mathias

  • #2
    Hallo,

    alle BLOb-Felder (zu denen ich jetzt auch einmal ein Memo-Feld zähle) gehören zur Kategorie der Sonderfälle, da hier der für den Datensatzpuffer benötigte Speicherplatz zum Zeitpunkt des Abfragens des Daten noch <b>nicht</b> feststeht.

    &gt;..der Rest vom Text wird immer an der gleichen Stelle abgeschnitten..

    Das ist eine Folge dieses Problems - wenn ADO nur die ersten 255 Zeichen abholt, ist das ein bequemer Kompromiss. Um die vollständigen Daten abzurufen, sah ADO in den ersten Versionen die Methode GetChunk und AppendChunk vor. ADO 2.5 hat zusätzlich zum Record-Objekt das <b>Stream</b>-Objekt in das ADO-Objektmodell eingeführt. Mit diesem Objekt vereinfacht sich der Zugriff auf BLOb-Daten, da das Hantieren mit den alten Methoden GetChunk und AppendChunk nicht mehr notwendig ist.

    Das folgende Beispiel demonstriert den Einsatz des Stream-Objekts:
    <pre>
    ...
    aRS := CoRecordset.Create;
    vSQL := ''SELECT ID, FileContents FROM StreamBLOBDemo WHERE ID = 1');
    aRS.Open(vSQL, ADOConnection1.ConnectionObject,
    adOpenForwardOnly, adLockReadOnly, adCmdText);
    // BLOb-Inhalt via Stream-Objekt auslesen und speichern
    aADOStream := CoStream.Create;
    aADOStream.Type_ := adTypeBinary;
    aADOStream.Open(EmptyParam, adModeUnknown,
    adOpenStreamUnspecified, '', '');
    aADOStream.Write(aRS.Fields.Item['FileContents'].Value);
    aADOStream.SaveToFile(FSaveFileName, adSaveCreateOverWrite);
    aADOStream.Close;
    </pre&gt

    Comment


    • #3
      Hallo,

      Danke für Info.

      <pre>
      aADOStream.Write(aRS.Fields.Item['FileContents'].Value);
      </pre>

      Kann man anstelle von aRS... auch myADODataSet.RecordSet... verwenden ?

      Gruß von Mathias und Danke nochma

      Comment


      • #4
        muss es wohl doch wie in deinem Beispiel machen, hatte mir gedacht das es vielleicht ein weg über die Delphi - Componenten gibt.

        Gruß
        Matz

        Comment


        • #5
          Hallo,

          vielen Dank für die Infos. Wie es aussieht gibt es da noch eine Besonderheit. Die eingeschränke Rückgabe von 255 Bytes tritt anscheinend nur auf wenn des entsprechende Feld über ein JOIN angefordert wird. Wenn man hingegen eine direkte Abfrage auf eine Tabelle durchführt, werden alle Daten des Blobfeldes zurückgegeben.

          Man kann also auch mit Standard Delphi Komponenten arbeiten und das entsprechnde Blobfeld nicht über ein JOIN sonder durch eine direkte Abfrage auf die entsprechende Tabelle ansprechen.

          <pre>
          ...
          var
          x : WideString;

          with myAdoDataSet do
          begin
          Close;
          CommandText :=
          SELECT Belegtext FROM Laender WHERE Land = "Andorra";
          Open;

          if FieldByName('Belegtext').Value <> Null then
          x:= FieldByName('Belegtext').Value;
          end;
          </pre>

          Gruß
          Mathia

          Comment

          Working...
          X