熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi中的Access技巧小結

2013-11-23 17:41:09  來源: Delphi編程 

  DELPHI中操作ACCESS數據庫(建立mdb文件壓縮數據庫)

  以下代碼在WINKDMDAC下測試通過 編譯好的程序在WIN第二版無ACCESS環境下運行成功

//在之前uses ComObjActiveX
//聲明連接字符串
Const
SConnectionString = Provider=MicrosoftJetOLEDB;Data Source=%s;
+Jet OLEDB:Database Password=%s;;

//=============================================================================
// Procedure: GetTempPathFileName
// Author : ysai
// Date :
// Arguments: (None)
// Result : string
//=============================================================================
function GetTempPathFileName():string;
//取得臨時文件名
var
SPathSfile&:array [] of char;
begin
GetTempPath(SPath);
GetTempFileName(SPath~SMSFile);
result:=SFile;
DeleteFile(PChar(result));
end;

//=============================================================================
// Procedure: CreateAccessFile
// Author : ysai
// Date :
// Arguments: FileName:String;PassWord:string=
// Result : boolean
//=============================================================================
function CreateAccessFile(FileName:String;PassWord:string=):boolean;
//建立Access文件如果文件存在則失敗
var
STempFileName:string;
vCatalog:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vCatalog:=CreateOleObject(ADOXCatalog);
vCatalogCreate(format(SConnectionString[STempFileNamePassWord]));
result:=CopyFile(PChar(STempFileName)PChar(FileName)True);
DeleteFile(STempFileName);
except
result:=false;
end;
end;

//=============================================================================
// Procedure: CompactDatabase
// Author : ysai
// Date :
// Arguments: AFileNameAPassWord:string
// Result : boolean
//=============================================================================
function CompactDatabase(AFileNameAPassWord:string):boolean;
//壓縮與修復數據庫覆蓋源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject(JROJetEngine);
vJECompactDatabase(format(SConnectionString[AFileNameAPassWord])
format(SConnectionString[STempFileNameAPassWord]));
result:=CopyFile(PChar(STempFileName)PChar(AFileName)false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
//=============================================================================
// Procedure: ChangeDatabasePassword
// Author : ysai
// Date :
// Arguments: AFileNameAOldPassWordANewPassWord:string
// Result : boolean
//=============================================================================
function ChangeDatabasePassword(AFileNameAOldPassWordANewPassWord:string):boolean;
//修改ACCESS數據庫密碼
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject(JROJetEngine);
vJECompactDatabase(format(SConnectionString[AFileNameAOldPassWord])
format(SConnectionString[STempFileNameANewPassWord]));
result:=CopyFile(PChar(STempFileName)PChar(AFileName)false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;

  ACCESS中使用SQL語句應注意的地方及幾點技巧

  以下SQL語句在ACCESS XP的查詢中測試通過

  建表:
Create Table Tab (
ID Counter
Name string
Age integer
[Date] DateTime);

  技巧:

  自增字段用 Counter 聲明

  字段名為關鍵字的字段用方括號[]括起來數字作為字段名也可行

  建立索引:

  下面的語句在Tab的Date列上建立可重復索引
Create Index iDate ON Tab ([Date]);

  完成後ACCESS中字段Date索引屬性顯示為 有(有重復)

  下面的語句在Tab的Name列上建立不可重復索引
Create Unique Index iName ON Tab (Name);

  完成後ACCESS中字段Name索引屬性顯示為 有(無重復)

  下面的語句刪除剛才建立的兩個索引
Drop Index iDate ON Tab;
Drop Index iName ON Tab;

ACCESS與SQLSERVER中的UPDATE語句對比:
SQLSERVER中更新多表的UPDATE語句:
UPDATE Tab
SET aName = bName
FROM Tab aTab b
WHERE aID = bID;

  同樣功能的SQL語句在ACCESS中應該是
UPDATE Tab aTab b
SET aName = bName
WHERE aID = bID;

  即:ACCESS中的UPDATE語句沒有FROM子句所有引用的表都列在UPDATE關鍵字後

  上例中如果Tab可以不是一個表而是一個查詢例:
UPDATE Tab a(Select IDName From Tab) b
SET aName = bName
WHERE aID = bID;

  訪問多個不同的ACCESS數據庫在SQL中使用In子句:
Select a*b* From Tab aTab b In dbmdb Where aID=bID;

  上面的SQL語句查詢出當前數據庫中Tab和dbmdb(當前文件夾中)中Tab以ID為關聯的所有記錄

  缺點外部數據庫不能帶密碼

  補充:看到ugvanxk在一貼中的答復可以用
Select * from [c:\aa\amdb;pwd=]table;
ACCESS XP測試通過

  在ACCESS中訪問其它ODBC數據源

  下例在ACCESS中查詢SQLSERVER中的數據
SELECT * FROM Tab IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=;DataBase=Demo;]

  外部數據源連接屬性的完整參數是:
[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]

  其中的DRIVER=driver可以在注冊表中的
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINSTINI\

  中找到異構數據庫之間導數據參見 碧血劍 的
http://wwwdelphibbscom/delphibbs/dispqasp?lid=

  ACCESS支持子查詢

  ACCESS支持外連接但不包括完整外部聯接如支持
LEFT JOIN 或 RIGHT JOIN

  但不支持
FULL OUTER JOIN 或 FULL JOIN

  ACCESS中的日期查詢

  注意:ACCESS中的日期時間分隔符是#而不是引號
Select * From Tab Where [Date]>##;
在DELPHI中我這樣用
SQLAdd(Format(
Select * From Tab Where [Date]>#%s#;
[DateToStr(Date)]));

  ACCESS中的字符串可以用雙引號分隔但SQLSERVER不認所以為了遷移方便和兼容 建議用單引號作為字符串分隔符


From:http://tw.wingwit.com/Article/program/Delphi/201311/24888.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.