delphi的万能数据库操作

152 篇文章 1 订阅
75 篇文章 1 订阅

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

 

  1. unit RaDBOLE;
  2. interface
  3. uses
  4.   SysUtils, Classes, DB, DBTables, JPEG, ExtCtrls, GIFCtrl;
  5. type
  6.   TImageType = (itBMP, itJPG, itGIF, itOther);
  7.   TOnSaveData = procedure(Sender: TObject) of object;
  8.   TOnLoadData = procedure(Sender: TObject) of object;
  9.   TOnShowImage = procedure(Sender: TObject; ImageType: TImageType) of object;
  10. type
  11.   TRaDBOLE = class(TComponent)
  12.   private
  13.     fDataSet: TDataSource;
  14.     fDataField: string;
  15.     fImage: TImage;
  16.     fGifImage: TRxGIFAnimator;
  17.     fOnSaveData: TOnSaveData;
  18.     fOnLoadData: TOnLoadData;
  19.     fOnShowImage: TOnShowImage;
  20.   protected
  21.   public
  22.     constructor Create(AOwner: TComponent); override;
  23.     {保存到数据库}
  24.     function SaveToDatabase(AFileName: string): boolean;
  25.     {追加到数据库}
  26.     function AppendToDatabase(AFileName: string): boolean;
  27.     {从数据库读出到流}
  28.     function LoadToStream(var AStream: TStream): boolean;
  29.     {从数据库读出到文件}
  30.     function LoadToFile(AFileName: string): boolean;
  31.     {读取图片}
  32.     procedure GetImage;
  33.   published
  34.     property DataSet: TDataSource read fDataSet write fDataSet;
  35.     property DataField: string read fDataField write fDataField;
  36.     property Image: TImage read fImage write fImage;
  37.     property GifImage: TRxGIFAnimator read fGifImage write fGifImage;
  38.     property OnSaveData: TOnSaveData read fOnSaveData write fOnSaveData;
  39.     property OnLoadData: TOnLoadData read fOnLoadData write fOnLoadData;
  40.     property OnShowImage: TOnShowImage read fOnShowImage write fOnShowImage;
  41.   end;
  42. procedure Register;
  43. implementation
  44. procedure Register;
  45. begin
  46.   RegisterComponents('Rarnu Components', [TRaDBOLE]);
  47. end;
  48. { TRaDBOLE }
  49. function TRaDBOLE.AppendToDatabase(AFileName: string): boolean;
  50. var
  51.   mm: tmemorystream;
  52. begin
  53.   result := True;
  54.   mm := tmemorystream.Create;
  55.   mm.LoadFromFile(AFileName);
  56.   mm.Position := 0;
  57.   try
  58.     fDataSet.DataSet.Append;
  59.     tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
  60.     fDataSet.DataSet.Post;
  61.   except
  62.     result := False;
  63.   end;
  64.   mm.Free;
  65.   if Assigned(OnSaveData) then
  66.     OnSaveData(Self);
  67. end;
  68. constructor TRaDBOLE.Create(AOwner: TComponent);
  69. begin
  70.   inherited Create(AOwner);
  71.   fDataSet := nil;
  72.   fDataField := '';
  73.   fImage := nil;
  74. end;
  75. procedure TRaDBOLE.GetImage;
  76. var
  77.   ww: tmemorystream;
  78.   JPEG: TJPEGImage;
  79.   IT: TImageType;
  80. begin
  81.   if fImage = nil then Exit;
  82.   ww := tmemorystream.Create;
  83.   tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(ww);
  84.   try
  85.     fImage.Picture.Assign(fDataSet.DataSet.FieldByName(fDataField));
  86.     IT := itBMP;
  87.   except
  88.     try
  89.       JPEG := TJPEGImage.Create;
  90.       JPEG.Assign(fDataSet.DataSet.FieldByName(fDataField));
  91.       fImage.Picture.Assign(JPEG);
  92.       IT := itJPG;
  93.     except
  94.       try
  95.         if fGifImage = nil then Exit;
  96.         fGifImage.Image.Assign(fDataSet.DataSet.FieldByName(fDataField));
  97.         IT := itGIF;
  98.       except
  99.         IT := itOther;
  100.       end;
  101.     end;
  102.   end;
  103.   //fImage.Picture.Graphic.LoadFromStream(ww);
  104.   ww.Free;
  105.   if Assigned(OnShowImage) then
  106.     OnShowImage(Self, IT);
  107. end;
  108. function TRaDBOLE.LoadToFile(AFileName: string): boolean;
  109. var
  110.   tt: tmemorystream;
  111. begin
  112.   result := True;
  113.   tt := tmemorystream.Create;
  114.   try
  115.     tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
  116.     tt.Position := 0;
  117.     tt.SaveToFile(AFileName);
  118.   except
  119.     result := False;
  120.   end;
  121.   tt.Free;
  122.   if Assigned(OnLoadData) then
  123.     OnLoadData(Self);
  124. end;
  125. function TRaDBOLE.LoadToStream(var AStream: TStream): boolean;
  126. var
  127.   tt: tmemorystream;
  128. begin
  129.   result := True;
  130.   tt := tmemorystream.Create;
  131.   try
  132.     tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
  133.     tt.Position := 0;
  134.     AStream := tt;
  135.   except
  136.     result := False;
  137.   end;
  138.   tt.Free;
  139.   if Assigned(OnLoadData) then
  140.     OnLoadData(Self);
  141. end;
  142. function TRaDBOLE.SaveToDatabase(AFileName: string): boolean;
  143. var
  144.   mm: tmemorystream;
  145. begin
  146.   result := True;
  147.   mm := tmemorystream.Create;
  148.   mm.LoadFromFile(AFileName);
  149.   mm.Position := 0;
  150.   try
  151.     fDataSet.Edit;
  152.     tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
  153.     fDataSet.DataSet.Post;
  154.   except
  155.     result := False;
  156.   end;
  157.   mm.Free;
  158.   if Assigned(OnSaveData) then
  159.     OnSaveData(Self);
  160. end;
  161. end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值