DELPHI 數據庫操作


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 * 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;   
View Code

 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. 
View Code

Delphi數據庫連接池源碼

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.
View Code

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字段

1.連接
用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.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)
View Code

在庫中直接保存原始數據

定義:

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; 
View Code

讀取數據

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.
View Code

樹型結構

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)
顯示的時候做相反的動作即可。
View Code

用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數據庫中圖像的存儲和顯示
一、 原理介紹--流式數據的類型及其應用
在Dephi中提供了TStream來支持對流式數據的操作。TStream是萬流之源,但由於它是一個抽象類,故不能被直接使用;而要使用其相應的子類,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了統一、簡潔的方法來進行數據的讀寫。
1.)SaveToStream(Stream: TStream );    作用:將類中的數據寫到Stream的當前位置中 
2.)LoadFromStream(Stream: TStream); 作用:從當前位置讀入Stream里的數據 
實際使用時我們基本上只要使用上面兩個函數就可以了。 
二、所遇到的問題及相應的解決方法
為了節省圖像的存儲空間和使用更加方便,決定采用JPEG這種圖像格式。
(一)所遇到的問題
第一、在Delphi 5中進行畫圖所用到的組件是TImage,所生成的圖像的格式為BMP格式,而為了節省圖像的存儲空間,圖像在數據庫里存儲的格式須為JPEG格式,這樣就產生了圖像格式轉化的需求;而TImage本身並不直接提供這兩種圖像格式之間的轉化。
第二、怎樣將存儲在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;
View Code

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;
View Code

 

在 '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編程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM