好多人都抱怨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. 
---------------------
作者:清风古韵
来源:CSDN
原文:https://blog.csdn.net/ttpage/article/details/9161695
版权声明:本文为博主原创文章,转载请附上博文链接!

delphi的万能数据库操作的更多相关文章

  1. DELPHI XE MYSQL数据库操作类 MYSQLHELPER

    注: 无需odbc配置 {* * MySQL Helper v1.0 * 2015.6.19 * 说明: * 这是一个操作MySQL的类,该类必须和libmysql.dll,dbxmys.dll两个文 ...

  2. DELPHI 数据库操作

    DELPHI 把数据库中的数据转换成XML格式 function ReplaceString(AString: string): string; begin Result := StringRepla ...

  3. 数据库操作API 或万能的双下划线

    数据库操作API: 类型 描述 exact 精确匹配: polls.get_object(id__exact=14). iexact 忽略大小写的精确匹配: polls.objects.filter( ...

  4. Delphi的注册表操作

    转帖:Delphi的注册表操作 2009-12-21 11:12:52 分类: Delphi的注册表操作 32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息.     一.创 ...

  5. 《万能数据库查询分析器》实现使用SQL语句直接高效地访问文本文件

    <万能数据库查询分析器>实现使用SQL语句直接高效地访问文本文件 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要    用SQL语句来直接访问文本文件?是在做梦吗? ...

  6. “万能数据库查询分析器” 5.03发布,访问EXCEL将自动为表名前后加上中括弧

        "万能数据库查询分析器" 5.03发布,访问EXCEL将自动为表名前后加上中括弧 1          引言    中国本土程序员马根峰推出的个人作品----万能数据库查询 ...

  7. Python学习笔记:sqlite3(sqlite数据库操作)

    对于数据库的操作,Python中可以通过下载一些对应的三方插件和对应的数据库来实现数据库的操作,但是这样不免使得Python程序变得更加复杂了.如果只是想要使用数据库,又不想下载一些不必要的插件和辅助 ...

  8. [转帖]万能数据库的使用【DbVisualizer软件,连接不同类型的数据库】

    万能数据库的使用[DbVisualizer软件,连接不同类型的数据库] https://www.cnblogs.com/FanSunny/p/4874572.html 自己就是用这个工具进行处理的. ...

  9. MySQL数据库操作:“增删改查”,忘记密码重置等。

    [注] 数据库的“增删查改”,参考原作者Wid:http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html#d11.感谢大佬们的技术分享 ...

随机推荐

  1. python常用模块之sys, os, random

    一. sys模块 1. 作用: sys模块是与python解释器交互的一个接口 2. 具体使用 1. sys.argv 获取当前正在执行的命令行列表, 第一个为程序本身路径 print('file n ...

  2. [第一波模拟\day3\T2]{独立集}(bubble.cpp)

    [问题描述] 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独 ...

  3. SpringMVC最核心

    如图所示:

  4. java环境配置——工具下载地址

    每次官网找个下载地址都是 费劲巴拉的 整理了一下几个下载地址分享给大家 eclipse:http://www.eclipse.org/downloads/packages/release/Kepler ...

  5. 记第一次开发安卓应用——IT之家RSS阅读器

    这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...

  6. NYOJ-517-最小公倍数,大数啊~~~

    最小公倍数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致.但也并非纯粹的偶然:60是个优秀的数字,它的 ...

  7. HDU1002 大数相加

    #include <iostream> #include <iostream> #include <iomanip> #include<string> ...

  8. ng-repeat的作用域问题

    ng-repeat会创建一个子作用域,所以在ng-repeat下面要使用参数时,要用$parent.XXXX参数. 示例如下:

  9. NOI导刊2010提高(06) 黑匣子

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  10. 希尔排序(shell)

    希尔排序: 思路: 希尔排序是插入排序的一种改进的版本. 先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序. 这里增量序 ...