zoukankan      html  css  js  c++  java
  • delphi的万能数据库操作

    好多人都抱怨delphi没有提供一个可以把任意数据放入数据库的控件,虽然说用代码实现也不难,但是有控件会更方便,这次我终于还是抽出空来做了 这么个控件,以后就可以直接拖放了。它支持把任意数据类型写入数据库,也可以从数据库读出到流,或是直接保存为文件。另外,我加了一些对常用图像的处理, 保存jpg或是gif格式的图像很方便,并且可以直接显示到image上。

    unit RaDBOLE;

    interface

    uses
      SysUtils, Classes, DB, DBTables, JPEG, ExtCtrls, GIFCtrl;

    type
      TImageType = (itBMP, itJPG, itGIF, itOther);
      TOnSaveData = procedure(Sender: TObject) of object;
      TOnLoadData = procedure(Sender: TObject) of object;
      TOnShowImage = procedure(Sender: TObject; ImageType: TImageType) of object;

    type
      TRaDBOLE = class(TComponent)
      private
        fDataSet: TDataSource;
        fDataField: string;
        fImage: TImage;
        fGifImage: TRxGIFAnimator;
        fOnSaveData: TOnSaveData;
        fOnLoadData: TOnLoadData;
        fOnShowImage: TOnShowImage;
      protected

      public
        constructor Create(AOwner: TComponent); override;
        {保存到数据库}
        function SaveToDatabase(AFileName: string): boolean;
        {追加到数据库}
        function AppendToDatabase(AFileName: string): boolean;
        {从数据库读出到流}
        function LoadToStream(var AStream: TStream): boolean;
        {从数据库读出到文件}
        function LoadToFile(AFileName: string): boolean;
        {读取图片}
        procedure GetImage;
      published
        property DataSet: TDataSource read fDataSet write fDataSet;
        property DataField: string read fDataField write fDataField;
        property Image: TImage read fImage write fImage;
        property GifImage: TRxGIFAnimator read fGifImage write fGifImage;
        property OnSaveData: TOnSaveData read fOnSaveData write fOnSaveData;
        property OnLoadData: TOnLoadData read fOnLoadData write fOnLoadData;
        property OnShowImage: TOnShowImage read fOnShowImage write fOnShowImage;
      end;

    procedure Register;

    implementation

    procedure Register;
    begin
      RegisterComponents('Rarnu Components', [TRaDBOLE]);
    end;

    { TRaDBOLE }

    function TRaDBOLE.AppendToDatabase(AFileName: string): boolean;
    var
      mm: tmemorystream;
    begin
      result := True;
      mm := tmemorystream.Create;
      mm.LoadFromFile(AFileName);
      mm.Position := 0;
      try
        fDataSet.DataSet.Append;
        tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
        fDataSet.DataSet.Post;
      except
        result := False;
      end;
      mm.Free;
      if Assigned(OnSaveData) then
        OnSaveData(Self);
    end;

    constructor TRaDBOLE.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      fDataSet := nil;
      fDataField := '';
      fImage := nil;
    end;

    procedure TRaDBOLE.GetImage;
    var
      ww: tmemorystream;
      JPEG: TJPEGImage;
      IT: TImageType;
    begin
      if fImage = nil then Exit;
      ww := tmemorystream.Create;
      tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(ww);
      try
        fImage.Picture.Assign(fDataSet.DataSet.FieldByName(fDataField));
        IT := itBMP;
      except
        try
          JPEG := TJPEGImage.Create;
          JPEG.Assign(fDataSet.DataSet.FieldByName(fDataField));
          fImage.Picture.Assign(JPEG);
          IT := itJPG;
        except
          try
            if fGifImage = nil then Exit;
            fGifImage.Image.Assign(fDataSet.DataSet.FieldByName(fDataField));
            IT := itGIF;
          except
            IT := itOther;
          end;
        end;
      end;
      //fImage.Picture.Graphic.LoadFromStream(ww);
      ww.Free;
      if Assigned(OnShowImage) then
        OnShowImage(Self, IT);
    end;

    function TRaDBOLE.LoadToFile(AFileName: string): boolean;
    var
      tt: tmemorystream;
    begin
      result := True;
      tt := tmemorystream.Create;
      try
        tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
        tt.Position := 0;
        tt.SaveToFile(AFileName);
      except
        result := False;
      end;
      tt.Free;
      if Assigned(OnLoadData) then
        OnLoadData(Self);
    end;

    function TRaDBOLE.LoadToStream(var AStream: TStream): boolean;
    var
      tt: tmemorystream;
    begin
      result := True;
      tt := tmemorystream.Create;
      try
        tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
        tt.Position := 0;
        AStream := tt;
      except
        result := False;
      end;
      tt.Free;
      if Assigned(OnLoadData) then
        OnLoadData(Self);
    end;

    function TRaDBOLE.SaveToDatabase(AFileName: string): boolean;
    var
      mm: tmemorystream;
    begin
      result := True;
      mm := tmemorystream.Create;
      mm.LoadFromFile(AFileName);
      mm.Position := 0;
      try
        fDataSet.Edit;
        tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
        fDataSet.DataSet.Post;
      except
        result := False;
      end;
      mm.Free;
      if Assigned(OnSaveData) then
        OnSaveData(Self);
    end;

    end.

  • 相关阅读:
    转:Gerrit 学习
    list, set操作
    Dice chrone execise
    【转】terminal 快捷键
    python package list
    爬虫2
    爬虫 1
    django跨表联查传输数据到前端
    vue实现鼠标移入移出事件
    pycharm意外关闭导致报错Unexpected content storage modification:
  • 原文地址:https://www.cnblogs.com/railgunman/p/1889729.html
Copyright © 2011-2022 走看看