Announcement

Collapse
No announcement yet.

Grafik JPEG/BMP in Datenbankfeld mit SQL speichern

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

  • Grafik JPEG/BMP in Datenbankfeld mit SQL speichern

    Wie kann ich ein Foto in einen Datensatz speichern.
    Verwende unter Delphi folgenden Syntax.
    Query.edit;
    Query.FieldByName('Foto').??? // Wie übergebe ich den Inhalt einer Datei
    Query.post;

    Würde mich aber auch über einen SQL-String freuen, der den Inhalt übergibt.

  • #2
    Hallo,

    das folgende Beispiel demonstriert, wie der Inhalt einer BMP-Datei in einer MS SQL Server 2000-Datenbank abgelegt wird. Der Zugriff erfolgt dabei über ADO:
    <pre>
    unit ADO_InsertBMPDemoFrm;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, ADODB, StdCtrls, DBCtrls, ExtCtrls;

    type
    TForm1 = class(TForm)
    ButtonINSERT: TButton;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    ADODataSet1RecID: TAutoIncField;
    ADODataSet1BMP: TBlobField;
    ButtonSELECT: TButton;
    DBImage1: TDBImage;
    DataSource1: TDataSource;
    ADODataSet2: TADODataSet;
    DBNavigator1: TDBNavigator;
    procedure ButtonINSERTClick(Sender: TObject);
    procedure ButtonSELECTClick(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    {

    Vorbereitung in der MS SQL Server 2000-Datenbank:
    -------------------------------------------------

    USE tempdb
    GO

    CREATE TABLE DelphiBMP (
    RecID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    BMP IMAGE NOT NULL)
    GO

    Konfiguration im Objektinspektor:
    --------------------------------

    object Form1: TForm1
    Left = 286
    Top = 107
    Width = 696
    Height = 480
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object ButtonINSERT: TButton
    Left = 8
    Top = 16
    Width = 75
    Height = 25
    Caption = 'INSERT'
    TabOrder = 0
    OnClick = ButtonINSERTClick
    end
    object ButtonSELECT: TButton
    Left = 8
    Top = 72
    Width = 75
    Height = 25
    Caption = 'SELECT'
    TabOrder = 1
    OnClick = ButtonSELECTClick
    end
    object DBImage1: TDBImage
    Left = 8
    Top = 136
    Width = 273
    Height = 209
    DataField = 'BMP'
    DataSource = DataSource1
    TabOrder = 2
    end
    object DBNavigator1: TDBNavigator
    Left = 8
    Top = 112
    Width = 270
    Height = 25
    DataSource = DataSource1
    TabOrder = 3
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
    'fo=False;Initial Catalog=tempdb;Data Source=(local)'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 96
    Top = 16
    end
    object ADODataSet1: TADODataSet
    Connection = ADOConnection1
    CommandText = 'select RecID, BMP from DelphiBMP where 1=2'
    Parameters = <>
    Left = 136
    Top = 16
    object ADODataSet1RecID: TAutoIncField
    FieldName = 'RecID'
    ReadOnly = True
    end
    object ADODataSet1BMP: TBlobField
    FieldName = 'BMP'
    end
    end
    object DataSource1: TDataSource
    DataSet = ADODataSet2
    Left = 168
    Top = 72
    end
    object ADODataSet2: TADODataSet
    Connection = ADOConnection1
    CommandText = 'select RecID, BMP from DelphiBMP'
    Parameters = <>
    Left = 136
    Top = 72
    end
    end
    }

    procedure TForm1.ButtonINSERTClick(Sender: TObject);
    begin
    ADODataSet1.Active := True;
    ADODataSet1.Edit;
    ADODataSet1BMP.LoadFromFile('C:\Ablage\Angler.bmp' );
    ADODataSet1.Post;
    ADODataSet1.Active := False;
    end;

    procedure TForm1.ButtonSELECTClick(Sender: TObject);
    begin
    ADODataSet2.Active := False;
    ADODataSet2.Active := True;
    end;

    end.
    </pre>
    Hinter <i>ADODataSet1BMP</i> verbirgt sich eine über den Feldeditor von Delphi angelegte persistente TField-Instanz

    Comment


    • #3
      Danke für die schnelle Unterstützung,
      Ich verwende Delphi4 -> MYSQL-Server mit Zeos Komponenten.
      Habe aber keine ADODB zum einbinden.
      Derzeit lade ich Bild in TDBImage (.Loadfromfile)
      und möchte diesen Inhalt in mein BLOBField speichern

      Comment


      • #4
        Hallo,

        und wo ist da der Unterschied zu meinem Beispiel? Auch ich verwende ein TDBImage (allerdings zur Anzeige), da die persistente TField-Instanz <i>ADODataSet1BMP</i> vom Typ TBlobField die Grafikdaten direkt über LoadFromFile einlesen kann (der Umweg über TDBImage wird also nicht benötigt). Die persistente TField-Instanz <i>ADODataSet1BMP</i> ist mit der Tabellenspalte BMP verbunden, und die TDBImage-Instanz über DataField = 'BMP' ebenfalls.

        Wenn man allerdings alles von Hand selbst machen möchte, steht immer noch der Weg über <i>TFileStream.Create('C:\Ablage\Angler.bmp', fmOpenRead)</i> zum Einlesen der Grafikdaten und <i>ParamByName('BMP').LoadFromStream(OutFile, ftBlob)</i> zum Zuweisen an den Parameter zur Verfügung, um die Grafik über eine INSERT-Anweisung in die Datenbank zu schreiben

        Comment


        • #5
          Hallo,
          ich beschäftige mich auch gerade mit diesem Thema. BMPs speichern habe ich hinbekommen - aber wie speichere ich JPGs ??

          R

          Comment


          • #6
            Mit Delphi geht's standardmäßig erst ab 4.0.
            Dementsprechend bin ich daraufgekommen, dass das Blob-Feld
            ein large-blob sein muss, da sonst nicht das ganze Bild
            gespeichert wird.

            Beim schreiben lade ich das Bild in die Datenbank mit
            Query.Picture.LoadFromFile('FOTO.jpg')

            Comment


            • #7
              Was ist den ein Large-Blob unter Paradox?
              R

              Comment


              • #8
                Ein BLOB Feld = binäres großes Objekt.
                Versuch mal ein Memo oder binäres Feld.

                Unter MySQL hab ich Tiny, Blob, Medium und Long Blob's.
                Je nach Definition kann das Feld mit kleinen, ... Daten
                gefüllt werden

                Comment

                Working...
                X