DELPHI 把数据库中的数据转换成XML格式

function ReplaceString(AString: string): string;
begin
Result := StringReplace(AString, '&', '&', [rfReplaceAll]);
Result := StringReplace(Result, '>', '>', [rfReplaceAll]);
Result := StringReplace(Result, '<', '&lt;', [rfReplaceAll]);
end; function DataSetToXml(ADataSet: TDataSet;
Indent: Integer): string;
var
i: Integer;
Indent1, Indent2: string;
temp: string;
begin
Indent1 := Format('%*s', [Indent * , ' ']);
Indent2 := Indent1 + ' ';
Result := EmptyStr;
ADataSet.First;
while not ADataSet.Eof do
begin
Result := Result + Format('%s<%s>'##, [Indent1, 'Record']);
for i := to ADataSet.FieldCount - do
if ADataSet.Fields[i].DataType in [ftString..ftAutoInc, ftMemo,
ftWideString] then
begin
temp := ReplaceString(ADataSet.Fields[i].AsString)
Result := Result + Format('%2:s<%0:s>%1:s</%0:s>'##,
[ADataSet.Fields[i].FieldName, temp, Indent2])
end;
Result := Result + Format('%s</%s>'##, [Indent1, 'Record']);
ADataSet.Next;
end;
end; function GenerateXml(ADataSet: TDataSet): string;
begin
Result :=
Format('<?xml version="1.0" encoding="gb2312"?>'##'<Records>'##'%s</Records>',
[DataSetToXml(ADataSet, )]);
end;

 DELPHI存取JPEG、BMP图像到数据库完整解决方案

{=================================================================
DELPHI存取JPEG、BMP图像到数据库完整解决方案(演示版)
版权所有  李明亮 2003-2008
成都地区的朋友需要我兼职的话,请联系。
nlh6@sina.com.cn
==================================================================}
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ExtDlgs, StdCtrls, ADODB, Grids, DBGrids, ExtCtrls,jpeg,
DBCtrls; type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
selectimage: TButton;
savetodb: TButton;
OpenPictureDialog1: TOpenPictureDialog;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
savetofile: TButton;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Bevel1: TBevel;
Bevel2: TBevel;
GroupBox1: TGroupBox;
Image1: TImage;
Label3: TLabel;
Label4: TLabel;
DBImage1: TDBImage;
procedure selectimageClick(Sender: TObject);
procedure savetodbClick(Sender: TObject);
procedure ADOTable1AfterScroll(DataSet: TDataSet);
procedure savetofileClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ADOTable1BeforeScroll(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation
uses unit2;
{$R *.dfm} procedure TForm1.selectimageClick(Sender: TObject); //选择图像
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName );
end; ////如下保存方法only to sql and access'data
procedure TForm1.savetodbClick(Sender: TObject); //保存图像
var
strm:tmemorystream;
ext:string;
begin
if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
begin
ext:=extractfileext(openpicturedialog1.FileName );
strm := tmemorystream.Create ;
try
image1.Picture.Graphic.SaveToStream(strm);
adotable1.Edit ;
strm.Position :=;
DBImage1.dataField :=''; //dbimage只能显示BMP,否则myimage由BMP变为jpeg时会出错
tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
//如需直接由文件保存 TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
//以下记录保存到数据库的图像格式
if uppercase(ext) = '.BMP' then
begin
adotable1.FieldByName('isbmp').Value := ;
dbimage1.dataField := 'myimage';
end
else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN
adotable1.FieldByName('isbmp').Value := ;
adotable1.Post ;
finally
strm.Free ; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
end;
end;
end;
///如下显示方法不适用于paradox中的graphic字段的显示。
procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet); //显示图像
var
strm:tadoblobstream;
jpegimage:tjpegimage;
bitmap:tbitmap;
begin
strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);
try //try1
strm.position :=;
image1.Picture.Graphic := nil;
DBIMAGE1.DataField := '';
//显示时,BMP、JPEG两种图像数据必需分别处理
if adotable1.fieldbyname('isbmp').asstring ='' then
begin //begin11
bitmap := tbitmap.Create ;
try //try11
bitmap.LoadFromStream(strm);
image1.Picture.Graphic := bitmap;
DBIMAGE1.DataField := 'myimage';
finally
bitmap.Free;
end; //end try11
end //end begin11
else if adotable1.fieldbyname('isbmp').asstring ='' then
begin //begin12
jpegimage := tjpegimage.Create ;
try //try12
jpegimage.LoadFromStream(strm);
image1.Picture.Graphic := jpegimage;
finally
jpegimage.Free ;
end; //end try12
end; //end begin12
finally
strm.Free ;
end; //end try1
end; ////显示时必须分bmp and jpeg 两种情况处理,而保存可统一。 procedure TForm1.savetofileClick(Sender: TObject);
var
tmpstr:string;
begin
if image1.Picture.Graphic <> nil then
begin
tmpstr := openpicturedialog1.Filter;
if adotable1.fieldbyname('isbmp').asstring ='' then
begin
openpicturedialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
if openpicturedialog1.Execute then
image1.Picture.SaveToFile(openpicturedialog1.FileName+'.bmp');
end
else
begin
openpicturedialog1.Filter := 'JPEG Image File (*.jpg)|*.jpg';
if openpicturedialog1.Execute then
image1.Picture.SaveToFile(openpicturedialog1.FileName+'.jpg');
end;
openpicturedialog1.Filter := tmpstr;
end;
end; procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
adoconnection1.Connected := true;
adoconnection1.LoginPrompt := false;
adotable1.Active := true;
end; procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
begin
dbimage1.dataField :=''; //这条语句不能遗漏,不信你试试
end; end.

Delphi数据库连接池源码

.连接池基类THL_RTC_DBPool,可以在这个类基础上继承实现具体数据库的连接池
unit THighlander_rtcDatabasePool; // RTC SDK Test proyect
// freeware
// Font used in Delphi IDE = Fixedsys {
Database parameters:
Set before first call to AddDBConn or GetDBConn. Put a database connection back into the pool.
Need to call this after you抮e done using the connection. GetDBConn = Get database connection from the pool.
Need to call this after you抮e done using the connection. CloseAllDBConns = Close all connections inside the Pool.
} interface uses // From CodeGear
Classes, SysUtils, // From RealThinClient
rtcSyncObjs; type
THL_RTC_DBPool = class
private CS : TRtcCritSec;
fDBPool : TList; protected function SetUpDB : TComponent; virtual; abstract;
function InternalGetDBConn : TComponent;
function GetCount : integer;
procedure InternalPutDBConn(conn : TComponent ); public db_server : ansistring;
db_username : ansistring;
db_password : ansistring; property Count : integer read GetCount; constructor Create;
destructor Destroy; override; procedure AddDBConn;
procedure CloseAllDBConns ; end; implementation constructor THL_RTC_DBPool.Create;
begin
inherited Create; CS := TRtcCritSec.Create;
fDBPool := TList.Create; end; Function THL_RTC_DBPool.GetCount : integer;
begin
result := fDBPool.Count;
end; destructor THL_RTC_DBPool.Destroy;
begin
CloseAllDBConns;
fDBPool.Free;
CS.Free;
inherited;
end; procedure THL_RTC_DBPool.AddDBConn;
begin
CS.Enter;
try
fDBPool.Add(SetUpDB);
finally
CS.Leave;
end;
end; Function THL_RTC_DBPool.InternalGetDBConn : TComponent;
begin
Result := nil;
CS.Enter;
try
if fDBPool.Count > then begin
Result := fDBPool.items[fDBPool.Count-];
fDBPool.Delete(fDBPool.Count-);
end;
finally
CS.Leave;
end;
end; procedure THL_RTC_DBPool.InternalPutDBConn(conn : tcomponent) ;
begin
CS.Enter;
try
fDBPool.Add(conn);
finally
CS.Leave;
end;
end; procedure THL_RTC_DBPool.CloseAllDBConns;
var i : integer;
dbx : tComponent;
begin
CS.Enter;
try
for i := to fDBPool.count - do begin
dbx := fDBPool.items[i];
FreeAndNil(dbx);
end;
fDBPool.clear;
finally
CS.Leave;
end;
end; end. .在THL_RTC_DBPool上继承生成THL_RTC_IBXDBPoll连接池
[delphi] view plain copy unit THighlander_rtcIBXDatabasePool; // RTC SDK Test proyect
// freeware
// Font used in Delphi IDE = Fixedsys interface uses
// From CodeGear
Classes, SysUtils, // Classes and Components for accessing Interbase from Codegear
IBDatabase, // From RealThinClient
rtcSyncObjs, // Dennis Ortiz rtc DBPool version;
THighlander_rtcDatabasePool; type THL_RTC_IBXDBPoll = class(THL_RTC_DBPool)
protected
function SetUpDB : TComponent; override;
public
function GetDBConn : TIBDatabase;
procedure PutDBConn(conn : TIBDatabase);
end; implementation function THL_RTC_IBXDBPoll.SetUpDB : Tcomponent;
var pIBXTrans : TIBTransaction;
begin
Result := TIBDatabase.Create(nil);
try
tIBDatabase(result).DatabaseName := db_server;
tIBDatabase(result).LoginPrompt := false; pIBXTrans := TIBTransaction.Create(tIBDatabase(result));
pIBXTrans.Params.Clear;
pIbxTrans.Params.Add('read_committed');
pIbxTrans.Params.Add('rec_version');
pIbxTrans.Params.Add('nowait'); tIBDatabase(result).DefaultTransaction := pIBXTrans;
tIBDatabase(result).Params.Clear;
tIBDatabase(result).Params.add('user_name='+db_UserName);
tIBDatabase(result).Params.add('password='+db_Password);
tIBDatabase(result).Open;
except
FreeAndNil(Result);
raise;
end;
end; function THL_RTC_IBXDBPoll.GetDBConn : TIBDatabase;
begin
result := TIBDatabase(InternalGetDBConn); if Result = nil then begin
Result := TIBDatabase(SetupDB);
end else if not Result.Connected then begin
Result.Free;
Result := TIBDatabase(SetupDB);
end; end; procedure THL_RTC_IBXDBPoll.PutDBConn(conn : tIBDatabase);
begin
if conn is tIBDatabase then InternalPutDBConn(conn);
end; end.

delphi操作blob字段数据

第一种解决方案是在库中直接保存原始数据。具体方法如下:
  BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:
AblobField.LoadFromfile(aFileName);
  数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:
AblobField.SaveToFile(aFileName);
AOleContainer.CreateObjectFromFile(aFileName);
注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不? E格式,是不能直接读取的。直接读取将导致运行错误。

   第二种方案是在库中以OLE格式保存数据。具体方法如下:
  本方案的不同之处,在于数据入库前先进行格式的转换。格式的转换是通过OLE控件完成的。即,先创建OLE对象,然后入库。示例代码如下:
AOleContainer.CreateObjectFromFile(aFileName);
AoleContainer.SaveToFile(tmpFileName);
AblobField.LoadFromfile(tmpFileName);
  这样作的好处是,由于库中直接存储的是OLE格式,所以,在库与OLE控件之间的数据传递将非常方便。在这种情况下,可以通过文件直接传递:数据字段先将数据存到一个临时文件中,然后,OLE控件从临时文件中读取。即:
AblobField.SaveToFile(aFileName);
AOleContainer.LoadFromFile(aFileName);
另外,还可以通过内存流来完成。使用内存流,可减少磁盘操作,大大提高运行效率。即:
AblobField.SaveToStream(aStream);
AOleContainer.LoadFromStream(aStream);

delphi存取Blob字段

.连接
用Delphi中的TADOQuery查询Oracle10G中的数据表时,Open时提示"数据类型不被支持"的处理方法: 原因是你用的ADO &nbsp; for &nbsp; ORACLE的驱动是微软的Microsoft OLE DB provider for Oracle,不支持BLOB字段, 应使用ORACLE的驱动ORACLE provider for OLE DB,如果未装Oracle,去Oracle公司网站下载这个驱动.
Microsoft OLE DB provider for Oracle 的连接字符串: Provider=MSDAORA.;Password=nchyuser;User ID=nchyuser;Data Source=ncms;
ORACLE provider for OLE DB的连接字符串: Provider=OraOLEDB.Oracle;Password=nchyuser;Persist Security Info=True;User ID=nchyuser;Data Source=NCMS;Extended Properties=""
使用ORACLE provider for OLE DB的连接字符串就OK. .
CLOB类型数据的存取
{假设表t中B字段是CLOB类型}
{保存}
procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do
begin
Close;
Connection:=ADOConnection1;
SQL.Clear;
SQL.Add('select A,B from t where 1<>1');
Open;
Append;
FieldByName('A').AsInteger:=;
TBlobField(FieldByName('B')).LoadFromFile('d:\1.txt');
try
Post;
except
cancel;
showmessage('文件保存失败,请重试!');
exit;
end;
showmessage('文件保存成功!');
end;
end; {读}
procedure TForm1.Button2Click(Sender: TObject);
var
S:TADOBlobStream;
begin
with ADOQuery1 do
begin
Close;
Connection:=ADOConnection1;
SQL.Clear;
SQL.Add('select A,B from t where A=1');
Open;
if not IsEmpty then
begin
s:=TADOBlobStream.Create(TBlobField(FieldByName('B')),bmRead);
s.SaveToFile('d:\2.txt');
s.Free;
showmessage('文件读取成功!');
end else
showmessage('无数据!');
end;
end;
根据你要保存的数据,自己改变一下
-------------------------------------------- stream:TClientBlobStream,TADOBlobStream, http://www.cnblogs.com/del/archive/2010/02/04/1663860.html 使用Blob字段 midas 主要错误及解决方法:
),可以考虑在客户端和服务器内uses midaslib单元,这样就不用发布midas.dll文件了。
),或者在程序里用代码注册 也可以winexec(’regsvr32 c:\windows\system32\midas.dll‘,SW_show)

在库中直接保存原始数据

定义:

TUser = packed record
Name : string[];
CanAsk : boolean;
NumberOfQuestions : integer;
end; 存储: var
User : TUser;
blobF : TBlobField;
bs : TStream;
begin
User.Name := edName.Text;
User.NumberOfQuestions := StrToInt(edNOQ.Text) ;
User.CanAsk := chkCanAsk.Checked; myTable.Insert; blobF := myTable.FieldByName('data') as TBlobField;
bs := myTable.CreateBlobStream(blobF, bmWrite) ;
try
bs.Write(User,SizeOf(User)) ;
finally
bs.Free;
end;
end; 读取: var
User : TUser;
blobF : TBlobField;
bs : TStream;
begin
if myTable.FieldByName('data').IsBlob then
begin
blobF := DataSet.FieldByName('data') as TBlobField;
bs := myTable.CreateBlobStream(blobF, bmRead) ;
try
bs.Read(user,sizeof(TUser)) ;
finally
bs.Free;
end;
end; edName.Text := User.Name;
edNOQ.Text := IntToStr(User.NumberOfQuestions) ;
chkCanAsk.Checked := User.CanAsk;
end;

读取数据

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Str:String;
TxtFile:TextFile;//定义一个文本文件变量TxtFile
Ch:Char;
begin
{设置Table1的属性}
Table1.DatabaseName:=ExtractFilePath(ParamStr());
Table1.TableName:='friends.db';
Table1.open;
//将friends.txt分配给TxtFile变量
AssignFile(TxtFile,ExtractFilePath(ParamStr())+'friends.txt');
Reset(TxtFile); //打开friends.txt
Str:='';
while not Eof(TxtFile) do //循环读取文本内容
begin
Read(TxtFile,Ch); //从friends.txt中读一个字符
if Ch<>Char()then //是否为回车键
Str:=Str+Ch //不是回车键,继续读下一个字符
else
begin //是回车符,表明已经读完一行,此时Str变量即代表一行信息
Table1.Append; //追加记录
Table1.Edit; //编辑friends.db
{读取文本内容到四个字段中。关键:顶格的行列号是(1,1)}
Table1.FieldByName('姓名').AsString:=Copy(Str,,);
Table1.FieldByName('性别').AsString:=Copy(Str,,);
Table1.FieldByName('年龄').AsString:=Copy(Str,,);
Table1.FieldByName('省份').AsString:=Copy(Str,,);
Table1.Post; //将数据过至friends.db中
Read(TxtFile,Ch); //略过换行符
Str:=''; //清Str变量
end ;
end;
Button2.Enabled:=True;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
str:string;
begin
Memo1.clear;
for i:= to Table1.FieldCount- Do
str:=str+Table1.Fields[i].FieldName+' '; //读取字段
Memo1.Lines.Add(str);
Memo1.Lines.Add('');
str:='';
{循环读取表格中的内容}
Table1.First;
While not Table1.Eof Do
Begin
for i:= To Table1.FieldCount- Do
str:=str+Table1.Fields[i].AsString+' '; //读取数据记录
Memo1.Lines.Add(str);
Memo1.Lines.Add('');
str:='';
Table1.Next;
end;
end;
end.

树型结构

sort_tl分类表(树型结构)
Content_tl内容表(id、Father、sort、title、Created、Modification、)

treeview-listview-richview

//打开数据库
Function Sqlite_Open(Flnm:string;KeyWord:string;Conn:TUniConnection):integer;
//打开数据库
function Sqlite_Create_Tl(Flnm:string;Conn:TUniConnection):boolean;
Function Open_Sqlite(DBfile:string;TreeV:TTreeView;Conn:TUniConnection):boolean;
Function verify_User(Pwd:string;Conn:TUniConnection):boolean;
Function ISverify(Conn:TUniConnection):boolean;
Function Setverify(Pwd:string;Conn:TUniConnection):boolean;

怎样将RichEdit中格式化过的文本保存在数据库,以后回调时能够显示保存时的格式


save:
a TBlobField(Query1.FieldByName('RichEdit')).Assign(RichEdit1.Lines);
=================
.Lines不行的话改为.Lines.Text
b TBlobField(Query1.FieldByName('RichEdit')).LoadFromFile(filename); show:
RichEdit1.Lines.Assign(Query1.FieldByName('RichEdit')); 用流文件进行存储。 给个函数给你。 Function GetREditTextRTFIn(RichEdit:TRichEdit):String;
var
StreamF : TStringStream;
begin
StreamF := TStringStream.Create('');;
RichEdit.Lines.SaveToStream(StreamF);
Result := StreamF.DataString;
StreamF.Free;
end;
主要的作用就是把RICHEDIT的内容转成以流的形式保存在数据库中.
显示的时候再把数据从库中读出来就行了。 。定义一个stream:TStream
。RichEdit1.Lines.SaveToStream(stream)
。TBlobField(Query1.FieldByName('RichEdit')).Assign(stream)
显示的时候做相反的动作即可。

用delphi 7中的 DBImage 显示 sql 2000里面表的 图片

用delphi 中的 DBImage 显示 sql 里面表的 图片!

sql 的表该怎么设计呢? delphi 中的 deimage 是不是 选择 datasource=数据源,
DataField =列名 就可以啦! SQL Server图像字段操作1(转)
uses jpeg;
保存 :
var
Ms:TmemoryStream;
jpg:Tjpegimage;
begin
ms:=TmemoryStream.Create;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.SaveToStream(Ms) ;
Ms.Position :=;
ADOquery1.append;
TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
ADOquery1.Post;
Ms.Free ;
jpg.free;
end;
读取到image中:
Var
Ms:TStringStream;
jpg:Tjpegimage;
begin
Ms:=TstringStream.Create('');
TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
Ms.Position :=;
Jpg.LoadFromStream(Ms);
Image2.Picture.Assign(Jpg);
Ms.Free;
jpg.free;
end; 数据库中图片的存取2
在保存图片时用:
TBlobField(FieldByName('ZLPIC')).LoadFromFile(OPD.FileName);
其中OPD为一个打开文件对话框。 在打开图片时用:
MS := CreateBlobStream(FieldbyName('ZLPIC'),bmRead);
Image2.Picture.LoadFromStream(MS);
MS.Free;
MS 为TStream的变量。
从来没有什么问题,显示、打印都没问题,也没管过什么文件头。 注:以下程序中注意在uses处加上DB,jpeg,如没有则TBlobField找不到
如何实现在MS Access数据库中图像的存储和显示
一、 原理介绍--流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源,但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上是以二进制数据的形式存放的。
为了处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,大大提高运行效率。
具体的过程和相关的程序代码如下:
、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的作用。
、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。 使用ADO连接
.保存
TBlobField(ADOQuery1.FieldName('blob')).Loadfromfile('文件名')
提取
TBlobField(ADOQuery1.FieldName('blob')).Savetofile('文件名')
.
保存
(ADOQuery1.FieldByName('blob') as TBlobField).Loadfromfile('文件名')
提取
(ADOQuery1.FieldByName('blob') as TBlobField).Savetofile('文件名') ====================================
==================================== uses jpeg;
保存Image1中的图象至数据库 :
var
Ms:TmemoryStream;
jpg:Tjpegimage;
begin
ms:=TmemoryStream.Create;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.SaveToStream(Ms) ;
Ms.Position :=;
ADOquery1.append;
TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
ADOquery1.Post;
Ms.Free ;
jpg.free;
end;
从数据库中读取图象到image2中:
Var
Ms:TStringStream;
jpg:Tjpegimage;
begin
Ms:=TstringStream.Create('');
TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
Ms.Position :=;
Jpg.LoadFromStream(Ms);
Image2.Picture.Assign(Jpg);
Ms.Free;
jpg.free;
end; 例子2: procedure TForm1.Button1Click(Sender: TObject); //插入图片过程
var
testStream:TMemoryStream;
begin
try
testStream := TMemoryStream.Create; //创建内存流
Image1.Picture.Graphic.SaveToStream(testStream);  //将图片保存至内存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add('Insert into test (id,photo) values (:id,:photo)'); //进行插入操作
adoquery1.Parameters.ParamByName('id').Value := '';
adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); //读取保存的内存图
adoquery1.ExecSQL;
finally
testStream.Free;   //释放内存流
end;
end; procedure TForm1.Button2Click(Sender: TObject); //读取图片过程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //显示的转换为BlobFiled并保存至内存流
mStream.Position :=;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else
begin
image2.Picture :=nil;
end;
end;

delphi 一个关于xml文件导入数据库的问题

function LoadXml(shortPath:string;var xmlobj: IXMLDOMDocument):boolean;

var tmpXml:IXMLDOMDOCUMENT;

begin

   shortPath:=localPath+shortPath;

   if not FileExists(shortPath) then

     begin

      LoadXml:=false;

      exit;

     end;

   tmpxml := CreateOLEObject('Microsoft.XmlDom') as IXMLDOMDocument;

   tmpxml.async := false;

   tmpxml.load(shortPath);

   if tmpxml.parseError.errorCode <>  then

     begin

       LoadXml:=false;

       Exit;

     end;

   xmlobj:=tmpxml;

   tmpxml:=nil;

   Loadxml:=true;

end;

procedure InitNetInfo(var theNet:netInfoType);

var objxml:IxmlDomdocument;

    Node1:IxmlDomNode;

begin

if not Loadxml(iniFile,objXml) then exit;

Node1:=objXml.selectSingleNode('//DefaultIP');

if Node1<>nil then theNet.Csdn_IP:=Node1.text;

Node1:=objXml.selectSingleNode('//DefaultPath');

if Node1<>nil then theNet.Csdn_Path:=Node1.text;

Node1:=objXml.selectSingleNode('//UseProxy');

if Node1<>nil then theNet.flg_UseProxy:=StrtoBool(Node1.text);

Node1:=objXml.selectSingleNode('//ProxyIP');

if Node1<>nil then theNet.prx_IP:=Node1.text;

Node1:=objXml.selectSingleNode('//ProxyPort');

if Node1<>nil then theNet.prx_Port:=Node1.text;

Node1:=objXml.selectSingleNode('//ProxyUser');

if Node1<>nil then theNet.prx_User:=Node1.text;

Node1:=objXml.selectSingleNode('//ProxyPass');

if Node1<>nil then theNet.prx_Pass:=Node1.text;

//其他信息

Node1:=objXml.selectSingleNode('//HeadSize');

if Node1<>nil then HeadSize:=strtoint(Node1.text);

Node1:=objXml.selectSingleNode('//TopicSize');

if Node1<>nil then TopicSize:=strtoint(Node1.text);

objxml:=nil;

Node1:=nil;

end;

在 'msysobjects' 上没有读取数据权限

出现这个错误是因为系统数据对象没有设置相应的权限。

总结一下,可以通过如下方法解决:

1.打开access数据库,在工具 - 选项 - 视图 - 系统对象 打钩

2.在工具 - 安全 - 用户与组权限 中选择msysobjects 设置读取

3.如果想隐藏这些系统对象,只要工具 - 选项 - 视图 - 系统对象 把钩去掉!

在一个Dbgrid中显示多数据库

在数据库编程中,不必要也不可能将应用程序操作的所有数据库字段放入一个数据库文件中。正确的数据库结构应是:将数据库字段放入多个数据库文件,相关的数据库都包含一个唯一
的关键字段,在多数据库结构里可以建立联系。
例如:要编制一个人事管理程序,为简化演示程序,只建立两个数据库,每个数据库都只建
立两个字段。
个人简介 jianjie.dbf,由人事处维护;工资情况 gongzi.dbf,由财务处维护。
1.数据库的建立
进入DataBase Desktop,建立数据库结构如下:

jianjie.dbf
编号 字段名:bianhao size:4 type:number
姓名 字段名:xingming size:10 type:character

gongzi.dbf
编号 字段名:bianhao size:4 type:number
工资 字段名:gongzi size:4 Dec 2 type:number

注意: 两个数据库的bianhao字段的size、type必须一致。实际上,两数据库文件可以分布
在网络的不同计算机上,为便于演示,分别存为″c: \test\jianjie.dbf″和 ″c:\test
\gongzi.dbf″。

2.应用程序的编制
启动Delphi, 新建一个工程,在窗体中加入Query控件Query1,databasename属性设为c:
\test;

加入DataSource控件datasource1, DataSet属性设为Query1; 加入DbGrid控件 dbgrid1,
DataSource属性设为DataSource1,将Query1.sql属性设为

SELECT DISTINCT A.bianhao,a.xingming, b.gongzi
FROM ″jianjie.dbf″ A, ″gongzi.DBF″ b
WHERE A.bianhao=b.bianhao

再将Query1.enabled属性设为True, 不用编译, DbGrid1就会显示: bianhao,
xingming, gongzi三个字段。如果jianjie.dbf和gongzi.dbf中有记录,则记录会显示出来。因
篇幅所限,此文只介绍了Dbgrid中显示多个数据库内容的一般方法,读者可在此基础上进行完
善,使该方法更好地适应您的需要。

Delphi DBExpress 数据库教程自学

一、dbexpress组件
其组件下含以下控件,用于进行数据库操作
1.SQLconnection:故名思义,用于建立数据库连接(相当于ASP中的conn)。相关参数以对话框方式输入,也可通过object inspector进行修改。D7功能强大,可以连接包括MSSQL在内的6种流行数据库:DB2,informix,interbase,MSsql,Mysql,Oracle。以SQL为例,以下参数应注意:
(1) LoginPrompt:false/true,是否显示登录对话框,默认为false,程序调试时,建议设为true.
(2) connected,是否建立连接,默认为false,调试时建议改为true.
2.SQLdataset,通过此组件,可以建立数据集(相当于ASP中的recordset)。一般情况下,通过select语句生成一数据集,以供客户端使用,重要参数设置次序和说明如下:
(1)第一步:SQLConnection:设定数据库连接
(2)第二步:commandtype:可选参数有三种ctquery(默认,生成SQL查询:select,update,delete),ctstoreproc(执行存储过程),cttable(生成数据表),一般情况下,建议用ctquery.
(3)commandtext:执行的SQL命令,须手工输入:如select * from bmxx
(4)Params:SQL动态参数列表,如果commandtext的命令中用到了动态参数:select * from bmxx where id=:bmid,则在Params中自动出现bmid参数,系统要求对bmid的参数进一步设置,如数据类型等
(5)Active:仅有两个参数
flase:相当于ASP中的RS.close()
true:相当于ASP中的RS.open()
3.SQLQuery:可以看成是强化版的SQLdataset(commandtext=Ctquery),在程序设计中,多用于对数据表的增删更新操作(Add Delete Update),重要参数说明如下:
(1)第一步:SQLConnection:设定数据库连接
(2)第二步:SQL:执行的SQL命令,须手工输入:如delete from bmxx1 where bmid=10 等,
(3)第三步:Params:SQL动态参数列表,如果SQL命令中用到了动态参数:select * from bmxx where id=:bmid,则在Params中自动出现bmid参数,系统要求对bmid的参数进一步设置,如数据类型等
(4)第四步:Active:仅有两个参数
flase:相当于ASP中的RS.close()
true:相当于ASP中的RS.open()
4.SQLStoreProc可以看成是强化版的SQLdataset(commandtext=Ctstoreproc),用于调用数据库里的存储过程,重要参数说明如下:
(1)第一步:SQLConnection:设定数据库连接
(2)第二步:StoreProcNmae:调用的存储过程名称,系统自动从数据库中取得存储过程名列表
(3)第三步:Params:SQL动态参数列表,如果存储过程中用到了动态参数:那么Params中会自动出现相关参数。
(4)第四步:Active:仅有两个参数
flase:相当于ASP中的RS.close()
true:相当于ASP中的RS.open()
5.SQLtable可以看成是强化版的SQLdataset(commandtext=Cttable),用于数据库里的数据表的操作,相关参数如:indexFieldNmae,IndexNmae,MasterFields,MasterSource
6.SQLMonitor:方便程序员观察SQL命令执行情况的调试工具
7.SimpleDataSet,允许dbExpress修改数据的组件,可以结合Delphi的数据感知组件以访问数据
delphi数据库教程自学(2) By 风轻扬兮 发表于 2007-4-4 23:12:00
利用SQLconnection/SQLdataset/clientdataset/datasetprovider/datasource/dbnavigator建立可更新的数据集
1)建立SQLconnection(设置loginprompt:false,connected:true)===>SQLconnection1
说明:建立远程数据库的连接
2)建立SQLdataset(设置SQLconnection:SQLconnection1,commandtext:select * from bmxx)==>SQLdataset1
说明:建立远程数据库的远程记录集
3)建立Datasetprovider(设置其dataset:SQLdataset1)===>datasetprovider1
说明:将此记录集通过datasetprovider保存到本地缓存中
4)建立Clientdataset(设置其ProviderName:datasetprovider1,active:true)
说明:从本地缓存中建立本地记录集
5)建立datasource(在Clientdataset1上右击,选择Add fields,拖至表单上)==>datasource1
说明:显示本地记录集的记录对象
6)设置dbnavigator(设置datasource:dataspurce1)
说明:对本地记录集记录进行操作控制
-----------------------------------------------------------------------------------------------------------------------
经过上述操作,由于操作对象是本地缓存中的记录集,故dbEXpress单向游标的限制已经解决,通过dbnavigator组件,可以新增、修改、删除相关记录数据,但此时的操作仅对于本地缓存的记录集有效新增、修改、删除等操作的结果实际上并未更新于后台
-----------------------------------------------------------------------------------------------------------------------
如果需要更新后台数据,还必须调用Clientdataset1.Applyupdate(0)方法来进行

其过程比较复杂,但是建议在考虑性能时,最好采用此种方法
Delphi数据库教程自学(3) By 风轻扬兮 发表于 2007-4-5 8:11:00
SimpleDataSet的用法
第二讲曾经学习过,在建立可更新的数据集方面,我们通过四步来实现的
1)建立远程数据库连接sqlconnction1
2)建立远程记录集sqldataset1
3)将远程记录集导入至本地datasetprovider1
4)在本地缓存中寻对应记录集对象clientdataset1
对于一般的应用而言,这个过程比较繁琐,Delphi提供了一种简易建立本地可更新记录集的方法,即simpledataset,此方法简化了建立本地可更新数据集的过程,在对于小的应用时,如在不过分考虑性能的前提下,可通过此方法,快速建立可更新本地记录集。其过程和设置如下:
1)建立远程数据库连接sqlconnction1
2)建立simpledataset1,其重要参数如下:
(1)Connection:其设置同sqlconnction.(上述第一步)
(2)Dataset:其设置同sqldataset1.(上述第二步,注意,Active设为true)
回顾一下快速建立datasource1和DBNavigator的过程
1)双击simpledataset1,点右键,选择filed editor,在field editor中点右键,选择add all fields(CTRL+F)
2)选中所有字段(CTRL+L),拖至表单上,然后调整一次相关位置即可(可用CTRL+A全选,Shift+点击选择)
到此datasource及其字段的输入输出设置完成
3)建立DBNavigator,直接拖至表单上即可,设置一下其datasource为datasource1
利用simpledataset建立本地可更新数据源到此完成。
同样如果要更新远程数据表记录,必须调用simpledataset1.applyupdate(0)方法。
小结
simpledataset是一种经过简化后的建立本地可更新数据集的方法,相较dataset+datasetprovider+clientdataset方法而言,它较为便捷,但这是以牺牲数据库性能为代价的。
故在有一定性能要求的数据库设计中,不推荐使用,在日常学习中,可以经常使用simpledataset
delphi数据库自学教程(4) By 风轻扬兮 发表于 2007-4-5 8:50:00
TSimpledataset中的重要参数
1)dataset--------commandtype
有三个参数:(1)ctquery-----------执行SQL语句
(2)ctstoreproc------调用远程数据库中的存储过程
(3)cttable------------访问指定数据表中的所有数据
2)Active特性/Execute方法
(1)仅用于执行返回结果数据集的SQL语句,如select .....的SQL语句,设置Active属性为true=调用了
Tsimpledataset的open方法,设为false=调用了Tsimpledataset的close方法
(2)执行不返回结时数据集的SQL语句,例如Delete,Update,Insert或是DDL语句
3)PacketRecords,
一次从远程数据源中取得的记录数,说明如下:
-1 默认值,即一次性取出全部远程数据,建议10-100,应尽量避免造成网络拥挤。
0 取出远程数据表的元数据(描述数据的信息)
正数:指定数量
4)Data特性
用于暂时存储远程取得的数据集
5)Delta特性
用于暂时存储已经修改的数据
考虑到更大的控制能力和性能因素,建议在应用系统开发时,应尽可能避免用simpledataset,而采用
sqlconnetion+sqldataset+datasetprovider+clientdataset的方法来控制和访问相关数据
#delphi编程

DELPHI 数据库操作的更多相关文章

  1. DELPHI 数据库操作类(工具类)

    DELPHI 数据库连接类 做的时候目地是可以通过类的创建和释放进行数据库的短连接,在做服务端的时候每一个请求都通过类生成一个数据连接 unit UnDm; interface uses SysUti ...

  2. Delphi Excel 操作大全

    Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...

  3. delphi 换行操作 Word

    delphi 换行操作 我将我的商用<旅行社管理系统>的 发团通知 部分奉献给您,望对您有所帮助. procedure TFrmMain.N327Click(Sender: TObject ...

  4. delphi 数据库技术沉浮录--谨给成为历史的BDE

    2014年9月,delphi xe7 出来了,这次在数据库技术方面,彻底抛掉了从1995 年 delphi 1.0 就自带的(Borland Database Engine)数据库访问技术.从而宣告了 ...

  5. Delphi数据库处理

    Delphi数据库处理 第一节 BDE.ADO.InterBase和dbExpress Delphi中处理数据库主要有两种方法,也就是BDE.ADO,从Delphi 6.0开始还加入了一种dbExpr ...

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

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

  7. delphi完美经典-第16章 Delphi数据库程序设计----使用BDE组件

    第16章 Delphi数据库程序设计----使用BDE组件 Delphi访问数据库的方式有:ADO.BDE.dbExpress.InterBase Express. 一.TDataSet组件 虽然De ...

  8. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  9. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

随机推荐

  1. SNAT 和 DNAT

    SNAT是原地址转换,DNAT是目标地址转换. SNAT 内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换成公有ip.网关这个地址转换称为SNAT 企业内部的主机A想访问互联网上的 ...

  2. codeforces 1B 模拟

    题目大意: 给出两种行列位置的表示方法,一个是Excel表示法,一个是(R,C)坐标表示.给出一种表示,输出另外一种表示. 基本思路: 模拟,首先判断是哪一种表示法,然后转换成另外一种表示方法: 我做 ...

  3. 解决springdatajpa插入大量数据速度慢的问题

    通过看控制台日志可以知道,jpa执行插入的时候每次都会先查询是否存在,然后再一条一条的执行插入,速度相当慢,所以可以jpa和mybatis一起用,用mybatis写原生的sql语句,用过foreach ...

  4. SpringDataRedis依赖

    <dependencies>        <dependency>            <groupId>junit</groupId>       ...

  5. SQL 查询子句

    SQL WHERE Clause(查询子句) WHERE 子句用于过滤记录. SQL WHERE 子句 WHERE子句用于提取满足指定标准的记录. SQL WHERE 语法 SELECT column ...

  6. Shiro学习(8)拦截器机制

    8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com ...

  7. 栈+括号序列+暴力枚举——cf1248D1

    这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可 /* 枚举交换两个括号的位置,然后再对新的序列判一次即可 */ #incl ...

  8. Hbase的读写流程

    HBase读写流程 1.HBase读数据流程 HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在 ...

  9. App应用推广

    Android应用推广渠道: 360手机助手: http://dev.360.cn/ 应用宝: http://open.qq.com/ 百度手机助手: http://shouji.baidu.com/ ...

  10. php开发面试题---Linux常用命令大全

    php开发面试题---Linux常用命令大全 一.总结 一句话总结: ls 查看目录中的文件 cd .. 返回上一级目录 cat 查看文件内容 touch 新建文件或修改时间 1.linux 系统信息 ...