• 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.

  • 相关阅读:
    致敬尤雨溪,Vue.js 让我赚到了第一桶金
    JavaScript 构造树形结构的一种高效算法
    Webpack 4 Tree Shaking 终极优化指南
    腾讯前端面试题:一言不合就写个五子棋
    使用Web代理实现Ajax跨域
    Extjs 4 chart自定义坐标轴刻度
    五分钟了解浏览器的工作原理
    面试官:JavaScript 原始数据类型 Symbol 有什么用?
    JavaScript 初学者容易犯的几个错误,你中招没?
    帮助你更好的理解Spring循环依赖
  • 原文地址:https://www.cnblogs.com/railgunman/p/1889729.html
Copyright © 2020-2023  润新知