DELPHI 數據庫操做

DELPHI 把數據庫中的數據轉換成XML格式html

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數據庫鏈接池源碼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.
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格式,是不能直接讀取的。直接讀取將致使運行錯誤。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 &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數據庫中圖像的存儲和顯示
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;
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 數據庫教程自學

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

相關文章
相關標籤/搜索