Announcement

Collapse
No announcement yet.

Inberbase und Blob Felder

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

  • Inberbase und Blob Felder

    Hallo, <br>
    <br>
    in meinem Delphi-Programm möchte ich mit einem
    Insert (Update) und auch Select-Befehl <br> Daten in ein Blob-Datenfeld schreiben und auch auslesen können. <br>
    Wie realisiert man so etwas ? <br>
    Gibt es Codebeispiele dazu ? <br>
    Desweiteren möchte ich diese SQL-Befehle in einer Stored Procedure auslaggern. <br>
    Als Parameterwert müßte ich dann ein binäres Datenfeld übergeben ?? <br>
    Wie realisiert sieht man so etwas ? <br>
    Wir setzten Delphi 4.0 Professional, Interbase 5.6 ein. <br>
    Ein bestehendes Projekt soll dadurch erweitert werden. <br>
    <br>
    Vielen Dank. <br>
    <br>
    Gruß <br>
    <br>
    Ralf Eberhard

  • #2
    Hallo Ralf,

    mit welchen Komponenten erfolgt den der Zugriff auf Interbase?

    Gruß

    Torste

    Comment


    • #3
      Hallo Ralf,<p>
      aus meiner Blob-Sammlung für Zugriff mit Bde:
      <pre>
      {
      name:
      UpdateTextBlobField_Ex
      usage:
      update a blob field
      parameter:
      theTableName - table name
      thePrimaryKeyName - name of the primary key
      thePrimaryKeyValue - value of the primary key
      theFieldName - field name of the blob field
      theText - field value
      return parameter:
      theErrorStr - error message
      return:
      false on error
      notes:
      - additional to UpdateTextBlobField name of the
      primary key is needed
      }
      function UpdateTextBlobField_Ex(const theTableName: String;
      const thePrimaryKeyName: String; thePrimaryKeyValue: Integer;
      const theFieldName: String; const theText: String;
      var theErrorStr: String): Boolean;
      var
      FQuerySQL : TQuery;
      begin
      Result:= False;
      theErrorStr:= S_internal_error;

      try
      FQuerySQL := TQuery.Create(NIL);
      try
      with FQuerySQL do
      begin
      DataBaseName:= C_ALIASNAME;

      SQL.Add('Update '+theTableName+' Set ');
      SQL.Add(theFieldName+'=:'+theFieldName);
      SQL.Add('Where '+thePrimaryKeyName+'=:Id');
      ParamByName('Id').AsInteger:= thePrimaryKeyValue;
      {$IFDEF D1D2}
      ParamByName(theFieldName).AsString:= theText;
      {$ELSE}
      ParamByName(theFieldName).AsBlob:= theText;
      {$ENDIF}
      ExecSQL;
      end; { with FQuerySQL do }

      Result:= True;
      finally
      FQuerySQL.Free;
      end;
      except
      on E: Exception do theErrorStr:= E.message;
      end;
      end; { UpdateTextBlobField_Ex }

      {
      name:
      LoadTextBlobField
      usage:
      load the text from the blob field
      parameter:
      theTableName - table name
      thePrimaryKeyValue - value of the primary key
      theFieldName - field name of the blob field
      return parameter
      theText - the loaded field value
      theErrorStr - error message
      return:
      false on error
      notes:
      - i think the name of the primary key is always id
      }
      function LoadTextBlobField(const theTableName: String;
      thePrimaryKeyValue: Integer;
      const theFieldName: String; var theText: String;
      var theErrorStr: String): Boolean;
      begin
      Result:= LoadTextBlobField_Ex(theTableName, 'Id',
      thePrimaryKeyValue, theFieldName, theText, theErrorStr);
      end; { LoadTextBlobField }

      {
      name:
      LoadTextBlobField_Ex
      usage:
      load the text from the blob field
      parameter:
      theTableName - table name
      thePrimaryKeyName - name of the primary key
      thePrimaryKeyValue - value of the primary key
      theFieldName - field name of the blob field
      return parameter
      theText - the loaded field value
      theErrorStr - error message
      return:
      false on error
      notes:
      - additional to LoadTextBlobField name of the
      primary key is needed
      }
      function LoadTextBlobField_Ex(const theTableName: String;
      const thePrimaryKeyName: String; thePrimaryKeyValue: Integer;
      const theFieldName: String; var theText: String;
      var theErrorStr: String): Boolean;
      var
      FQuerySQL : TQuery;
      StringStream : TStringStream;
      Stream : TStream;
      begin
      Result:= False;
      theErrorStr:= S_internal_error;

      theText:= '';

      try
      FQuerySQL := TQuery.Create(NIL);
      StringStream := TStringStream.Create('');
      Stream := NIL;
      try
      with FQuerySQL do
      begin
      DataBaseName:= C_ALIASNAME;

      SQL.Add('Select '+theFieldName+' From '+theTableName);
      SQL.Add('Where '+thePrimaryKeyName+'=:Id');
      ParamByName('Id').AsInteger:= thePrimaryKeyValue;
      Open;
      try
      if QueryIsNotEmpty(FQuerySQL) then
      begin
      Stream:= CreateBlobStream(FieldByName(theFieldName),bmRead) ;

      StringStream.CopyFrom(Stream,0);

      theText:= StringStream.DataString;

      Result:= True;
      end;
      finally
      Close;
      end;
      end; { with FQuerySQL do }

      Result:= True;
      finally
      FQuerySQL.Free;
      StringStream.Free;
      Stream.Free;
      end;
      except
      on E: Exception do theErrorStr:= E.message;
      end;
      end; { LoadTextBlobField_Ex }
      </pre>
      <p>
      Das D1D2 ist für Delphi2, weil es das AsBlob erst ab Delphix(?) gibt.<br>
      Zugriff in SP habe ich noch nicht gemacht, das geht wohl nur über eine udf.
      <p>
      Heik

      Comment


      • #4
        Hallo, <br>
        vielen Daten für die Antworten.<br>
        <br>
        An Torsten: <br>
        Der Zugriff auf Interbase erfolgt über die
        Komponenten TQuery, TStoredProc.<br>
        An Heiko: <br>
        Hast Du Beispiele über die Anwendung von den User Defined Functions ?? <br>
        Muß ich dann noch für dieses alte Projekt in C/C++ programmieren ? <br>
        Danke. <br>
        <br>
        Gruß<br>
        <br>
        Ralf Eberhar

        Comment


        • #5
          Hallo Ralf,

          wenn Du die Blobdaten die Du an die SP übergibst auch so in die Tabelle schreibst, dann ist keine UDF notwendig.

          UDF's wären für eine Manipulation, einen Vergleich von Blob's usw. notwendig.

          UDF's können auch mit Delphi geschrieben werden. Allerdings sind sie dann nur für Windows verwendbar. Mit Kylix funktioniert es dann auch für Linux. Alternativ kann auch FreePascal verwendet werden bzw. halt C.

          Gruß

          Torste

          Comment


          • #6
            Hallo Torsten,<p>
            mit welchem Parameter-Typ übergibt man denn die Blob-Daten. Meine Queries (siehe oben) würde ich liebend gern als SP implementieren.
            <p>
            An Ralf: ich habe das nur mal gelesen, ich glaube das war in IBPhoenix.com.
            <p>
            Heik

            Comment


            • #7
              Hallo Heiko,

              "ftBlob" würde ich sagen. Es macht für die Parameterübergabe überhaupt keinen Unterschied ob die Daten an eine SP oder "normales" Insert/Update übergeben werden.

              Was man bei IB auf jeden Fall unterlassen sollte ist das zuweisen von einem Blobfeld an ein anderes. In diesem Fall wird nämlich nur die Blob-ID kopiert, d.h. zwei Blob-Felder zeigen auf die gleichen Blobdaten. Wird jetzt die erste Referenz gelöscht, dann enthält die zweite Referenz auf einmal eine ungültige Blob-ID.

              Gruß

              Torsten

              PS: Freepascal ist für Windows und Linux verfügba

              Comment

              Working...
              X