Announcement

Collapse
No announcement yet.

TIBBlobStream mit TIBQuery

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

  • TIBBlobStream mit TIBQuery

    Hallo zusammen!

    Zuerst einmal sorry, dass ich meine Anfrage in zwei verschiedenen Diskussionsforen gepostet habe (habe IBX erst später entdeckt).

    Ich habe eine grundsätzliche Frage zu den IBX-Komponenten:

    Ich benutze D5 Prof. und den auf der CD befindlichen InterBase-Server. Ich habe (z.Zt. noch) zwei Tabellen, die unter anderem auch BLOB-Felder (sowohl vom SUB_TYPE 1 als auch SUB_TYPE 0) enthalten. In meinem Programm möchte ich nur (wegen des Verzichts der BDE) die IBX-Komponenten einsetzen (oder sollte ich etwas anderes benutzen?). Außerdem verwende ich nur TIBQuery und keine TIBTable ohne (!!!) Design-Time-Felder. (Ich erstelle zum Eintragen der Daten nur temporäre Abfragen mit TIBQuery, die ich nach Benutzung wieder freigebe.)

    Nun endlich zum Problem: Wie trage ich mit TIBQuery Daten in ein BLOB-Feld (einmal ist es Text aus einem TMemo, einmal sind es diverse Grafiken) ein?

    Einen Hinweis, nämlich auf TIBBlobStream, habe ich gefunden, kann mit den Beispielen aus der Delphi-Hilfe jedoch nicht viel anfangen. Kann mir jemand helfen, oder sagen, wo ich die benötigten Infos herbekommen kann?

    Vielen Dank schon einmal im Voraus

    Lars

  • #2
    Hallo,

    um BLOB-Daten in eine InterBase-Tabelle über <b>TIBQuery</b> einzutragen, wird <b>TIBBlobStream</b> nicht unbedingt benötigt. Angenommen, die InterBase-Tabelle hat die folgende Struktur:
    <pre>
    CREATE TABLE MEMOTABLE (
    ID INTEGER NOT NULL PRIMARY KEY,
    TEXT BLOB SUB_TYPE 1 SEGMENT SIZE 80
    )
    </pre>
    Somit kann man mit TIBQuery auf 3 unterschiedliche Art und Weise Memodaten in die Tabellenspalte TEXT eintragen. Das folgende Beispiel verwendet dabei eine UPDATE-Anweisung, damit das Ergebnis visuell über ein TIBTable mit angeschlossener TDBRichEdit-Instanz sofort nachvollzogen werden kann. Im TIBQuery wird die UPDATE-Anweisung mit Parametern deklariert und jeder Parameter wird im Objektinspektor entsprechend konfiguriert:

    <pre>
    object IBQueryBlob: TIBQuery
    Database = IBDatabase1
    Transaction = IBTransaction1
    CachedUpdates = False
    SQL.Strings = (
    'UPDATE MemoTable'
    ' SET Text = :mRTFMemo'
    'WHERE ID = :iID')
    Left = 352
    Top = 288
    ParamData = <
    item
    DataType = ftBlob
    Name = 'mRTFMemo'
    ParamType = ptUnknown
    end
    item
    DataType = ftInteger
    Name = 'iID'
    ParamType = ptUnknown
    end>
    end
    </pre>
    Nach diesen Vorbereitungen stehen <b>Params[0].AsMemo</b>, <b>Params[0].SetBlobData</b> und <b>Params[0].LoadFromFile</b> zur Verfügung, um die Memo-Daten in der Blob-Spalte der Tabelle unterzubringen:
    <pre>
    procedure TFormMain.ButtonAsMemoClick(Sender: TObject);
    begin
    with IBQueryBlob do
    begin
    // Update-Variable via AsMemo-Zuweisung füllen
    Params[0].AsMemo := RichEdit1.Lines.Text;
    // Primärschlüssel des ausgewählten Datensatzes übergeben
    Params[1].Value := IBTable1ID.Value;
    ExecSQL;
    IBTransaction1.Commit;
    end;
    // zur Kontrolle die Anzeige via TTable aktualisieren
    IBTable1.Open;
    end;

    procedure TFormMain.ButtonSetBlobDataClick(Sender: TObject);
    var
    pBlobText : PChar;
    begin
    with IBQueryBlob do
    begin
    // Old-Fashion-Way über einen PChar
    pBlobText := RichEdit1.Lines.GetText;
    Params[0].SetBlobData(pBlobText, Length(pBlobText));
    // Primärschlüssel des ausgewählten Datensatzes übergeben
    Params[1].Value := IBTable1ID.Value;
    ExecSQL;
    IBTransaction1.Commit;
    end;
    IBTable1.Open;
    end;

    procedure TFormMain.ButtonLoadFromFileClick(Sender: TObject);
    begin
    if OpenDialogImport.Execute then
    begin
    with IBQueryBlob do
    begin
    // direkt aus einer externen Datei importieren
    Params[0].LoadFromFile(OpenDialogImport.Filename, ftBlob);
    // Primärschlüssel des ausgewählten Datensatzes übergeben
    Params[1].Value := IBTable1ID.Value;
    ExecSQL;
    IBTransaction1.Commit;
    end;
    IBTable1.Open;
    end;
    end;
    </pre>

    Für den Fall, das eine Beispiel für den Einsatz von <b>TIBBlobStream</b> gesucht wird, demonstriert der folgende Aufruf den Einsatz. Wichtig ist der Aufruf von <b>CreateBlobStream</b>, der intern eine TIBBlobStream-Instanz erzeugt:
    <pre>
    procedure TFormMain.Button1Click(Sender: TObject);
    var
    aStream : TStream;
    pBuffer : PChar;
    iMemSize : Integer;
    begin
    aStream := IBTable1.CreateBlobStream(IBTable1TEXT, bmRead);
    try
    iMemSize := aStream.Size + 1;
    if iMemSize > 1 then
    begin
    pBuffer := AllocMem(iMemSize);
    try
    aStream.Read(pBuffer^, iMemSize);
    ShowMessage(pBuffer);
    finally
    FreeMem(pBuffer, iMemSize);
    end;
    end;
    finally
    aStream.Free;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Hi Andreas,

      danke für die mehr als ausführliche Antwort. Mein Problem habe ich folgendermaßen gelöst:

      <b>IBQuery.ParamByName('Memo').DataType := ftBlob;<br>
      IBQuery.ParamByName('Memo').asMemo := Memo.Lines.Text;</b>

      Ansonsten habe ich nichts in meinem Programmtext geändert.

      Lars

      PS.: Andreas, wann erscheint endlich Dein neues Buch <b>Delphi Win32 Lösungen</b>??? Bestellt habe ich es schon vor über einer Woche. So langsam werde ich ungeduldig und weiß schon gar nicht mehr, was ich nachts lesen soll... ;

      Comment

      Working...
      X