delphi的万能数据库操作

来源:互联网 发布:网吧服务器攻击软件 编辑:程序博客网 时间:2024/04/29 23:35

好多人都抱怨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.

原创粉丝点击