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.

相关阅读 >>

Delphi 日期相关总结20190702完结篇

Delphi 生成txt 指定带bom

Delphi之memo组件

Delphi 2009 的反射单元(objauto):

Delphi 标头控件(theadercontrol)中的显示复选框

Delphi iddecodermime 对图像编码base64解码成图像文件

Delphi格式化函数format、formatdatetime和formatfloat

Delphi gdi+ 文本输出

Delphi强制关闭执行程序(杀进程)

Delphi实现win10下Delphi 10.3.1 inline hook 域名转向之internetconnecta

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...