DELPHI 把数据库中的数据转换成XML格式html
function ReplaceString(AString: string): string; begin Result := StringReplace(AString, '&', '&', [rfReplaceAll]); Result := StringReplace(Result, '>', '>', [rfReplaceAll]); Result := StringReplace(Result, '<', '<', [rfReplaceAll]); end; function DataSetToXml(ADataSet: TDataSet; Indent: Integer): string; var i: Integer; Indent1, Indent2: string; temp: string; begin Indent1 := Format('%*s', [Indent * 2, ' ']); Indent2 := Indent1 + ' '; Result := EmptyStr; ADataSet.First; while not ADataSet.Eof do begin Result := Result + Format('%s<%s>'#13#10, [Indent1, 'Record']); for i := 0 to ADataSet.FieldCount - 1 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>'#13#10, [ADataSet.Fields[i].FieldName, temp, Indent2]) end; Result := Result + Format('%s</%s>'#13#10, [Indent1, 'Record']); ADataSet.Next; end; end; function GenerateXml(ADataSet: TDataSet): string; begin Result := Format('<?xml version="1.0" encoding="gb2312"?>'#13#10'<Records>'#13#10'%s</Records>', [DataSetToXml(ADataSet, 1)]); 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 :=0; 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 := 1; dbimage1.dataField := 'myimage'; end else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN adotable1.FieldByName('isbmp').Value := 0; 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 :=0; image1.Picture.Graphic := nil; DBIMAGE1.DataField := ''; //显示时,BMP、JPEG两种图像数据必需分别处理 if adotable1.fieldbyname('isbmp').asstring ='1' 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 ='0' 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 ='1' 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数据库链接池源码sql
1.链接池基类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 > 0 then begin Result := fDBPool.items[fDBPool.Count-1]; fDBPool.Delete(fDBPool.Count-1); 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 := 0 to fDBPool.count - 1 do begin dbx := fDBPool.items[i]; FreeAndNil(dbx); end; fDBPool.clear; finally CS.Leave; end; end; end. 2.在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格式,是不能直接读取的。直接读取将致使运行错误。express
第二种方案是在库中以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字段windows
1.链接 用Delphi中的TADOQuery查询Oracle10G中的数据表时,Open时提示"数据类型不被支持"的处理方法: 缘由是你用的ADO for ORACLE的驱动是微软的Microsoft OLE DB provider for Oracle,不支持BLOB字段, 应使用ORACLE的驱动ORACLE provider for OLE DB,若是未装Oracle,去Oracle公司网站下载这个驱动. Microsoft OLE DB provider for Oracle 的链接字符串: Provider=MSDAORA.1;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. 2. 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:=1; 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 主要错误及解决方法: 1),能够考虑在客户端和服务器内uses midaslib单元,这样就不用发布midas.dll文件了。 2),或者在程序里用代码注册 也能够winexec(’regsvr32 c:\windows\system32\midas.dll‘,SW_show)
在库中直接保存原始数据缓存
定义: TUser = packed record Name : string[50]; 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(0)); Table1.TableName:='friends.db'; Table1.open; //将friends.txt分配给TxtFile变量 AssignFile(TxtFile,ExtractFilePath(ParamStr(0))+'friends.txt'); Reset(TxtFile); //打开friends.txt Str:=''; while not Eof(TxtFile) do //循环读取文本内容 begin Read(TxtFile,Ch); //从friends.txt中读一个字符 if Ch<>Char(13)then //是否为回车键 Str:=Str+Ch //不是回车键,继续读下一个字符 else begin //是回车符,代表已经读完一行,此时Str变量即表明一行信息 Table1.Append; //追加记录 Table1.Edit; //编辑friends.db {读取文本内容到四个字段中。关键:顶格的行列号是(1,1)} Table1.FieldByName('姓名').AsString:=Copy(Str,1,8); Table1.FieldByName('性别').AsString:=Copy(Str,9,2); Table1.FieldByName('年龄').AsString:=Copy(Str,13,2); Table1.FieldByName('省份').AsString:=Copy(Str,15,8); 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:=0 to Table1.FieldCount-1 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:=0 To Table1.FieldCount-1 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的内容转成以流的形式保存在数据库中. 显示的时候再把数据从库中读出来就好了。 1。定义一个stream:TStream 2。RichEdit1.Lines.SaveToStream(stream) 3。TBlobField(Query1.FieldByName('RichEdit')).Assign(stream) 显示的时候作相反的动做便可。
用delphi 7中的 DBImage 显示 sql 2000里面表的 图片
用delphi 7中的 DBImage 显示 sql 2000里面表的 图片! 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 :=0; 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 :=0; 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数据库中图像的存储和显示 1、 原理介绍--流式数据的类型及其应用 在Dephi中提供了TStream来支持对流式数据的操做。TStream是万流之源,但因为它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统1、简洁的方法来进行数据的读写。 1.)SaveToStream(Stream: TStream ); 做用:将类中的数据写到Stream的当前位置中 2.)LoadFromStream(Stream: TStream); 做用:从当前位置读入Stream里的数据 实际使用时咱们基本上只要使用上面两个函数就能够了。 2、所遇到的问题及相应的解决方法 为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。 (一)所遇到的问题 第1、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage自己并不直接提供这两种图像格式之间的转化。 第2、怎样将存储在Microsoft Access数据库中的图像取出而且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际须要,在Microsoft Access数据库中所存储的图像数据倒是以JPEG格式保存的。 (二)相应的解决方法 为了解决上述两个问题,能够采用目前数据库中一种名为大二分对象(BLOB--Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中其实是以二进制数据的形式存放的。 为了处理BLOB字段,能够借鉴一些可视的桌面数据库的方法。在这里,咱们选择了经过内存流的方式来完成;使用内存流,可减小磁盘操做,大大提升运行效率。 具体的过程和相关的程序代码以下: 1、如何实如今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:=0; Table1.Edit; TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS); Table1.Post; messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok); end; finally MyJPEG.Free; end; end; 在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的做用。 2、如何将图像从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:=0; 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链接 1.保存 TBlobField(ADOQuery1.FieldName('blob')).Loadfromfile('文件名') 提取 TBlobField(ADOQuery1.FieldName('blob')).Savetofile('文件名') 2. 保存 (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 :=0; 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 :=0; 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 := '003'; 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 :=0; 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 <> 0 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 数据库教程自学
1、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)创建远程数据库链接sqlconnction12)创建远程记录集sqldataset13)将远程记录集导入至本地datasetprovider14)在本地缓存中寻对应记录集对象clientdataset1对于通常的应用而言,这个过程比较繁琐,Delphi提供了一种简易创建本地可更新记录集的方法,即simpledataset,此方法简化了创建本地可更新数据集的过程,在对于小的应用时,如在不过度考虑性能的前提下,可经过此方法,快速创建可更新本地记录集。其过程和设置以下:1)创建远程数据库链接sqlconnction12)创建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方法而言,它较为便捷,但这是以牺牲数据库性能为代价的。故在有必定性能要求的数据库设计中,不推荐使用,在平常学习中,能够常用simpledatasetdelphi数据库自学教程(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编程