1.DELPHI中操作access數據庫(建立.mdb文件,壓縮數據庫)
以下代碼在WIN2K,D6,MDAC2.6下測試通過,
編譯好的程序在WIN98第二版無ACCESS環境下運行成功.
//在之前uses ComObj,ActiveX
//聲明連接字符串
Const
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Database PassWord=%s;';
//=============================================================================
// Procedure: GetTempPathFileName
// Author : ysai
// Date : 2003-01-27
// Arguments: (None)
// Result : string
//=============================================================================
function GetTempPathFileName():string;
//取得臨時文件名
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(PChar(result));
end;
//=============================================================================
// Procedure: CreateAccessFile
// Author : ysai
// Date : 2003-01-27
// 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('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
//=============================================================================
// Procedure: CompactDatabase
// Author : ysai
// Date : 2003-01-27
// Arguments: AFileName,APassWord:string
// Result : boolean
//=============================================================================
function CompactDatabase(AFileName,APassWord:string):boolean;
//壓縮與修復數據庫,覆蓋源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
//=============================================================================
// Procedure: ChangeDatabasePassword
// Author : ysai
// Date : 2003-01-27
// Arguments: AFileName,AOldPassWord,ANewPassWord:string
// Result : boolean
//=============================================================================
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//修改ACCESS數據庫密碼
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
2.ACCESS中使用SQL語句應注意的地方及幾點技巧
以下SQL語句在ACCESS XP的查詢中測試通過
建表:
Create Table Tab1 (
ID Counter,
Name string,
Age integer,
[Date] DateTime);
技巧:
自增字段用 Counter 聲明.
字段名為關鍵字的字段用方括號[]括起來,數字作為字段名也可行.
建立索引:
下面的語句在Tab1的Date列上建立可重復索引
Create Index iDate ON Tab1 ([Date]);
完成后ACCESS中字段Date索引屬性顯示為 - 有(有重復).
下面的語句在Tab1的Name列上建立不可重復索引
Create Unique Index iName ON Tab1 (Name);
完成后ACCESS中字段Name索引屬性顯示為 - 有(無重復).
下面的語句刪除剛才建立的兩個索引
Drop Index iDate ON Tab1;
Drop Index iName ON Tab1;
ACCESS與SQLSERVER中的UPDATE語句對比:
SQLSERVER中更新多表的UPDATE語句:
UPDATE Tab1
SET a.Name = b.Name
FROM Tab1 a,Tab2 b
WHERE a.ID = b.ID;
同樣功能的SQL語句在ACCESS中應該是
UPDATE Tab1 a,Tab2 b
SET a.Name = b.Name
WHERE a.ID = b.ID;
即:ACCESS中的UPDATE語句沒有FROM子句,所有引用的表都列在UPDATE關鍵字后.
上例中如果Tab2可以不是一個表,而是一個查詢,例:
UPDATE Tab1 a,(Select ID,Name From Tab2) b
SET a.Name = b.Name
WHERE a.ID = b.ID;
訪問多個不同的ACCESS數據庫-在SQL中使用In子句:
Select a.*,b.* From Tab1 a,Tab2 b In 'db2.mdb' Where a.ID=b.ID;
上面的SQL語句查詢出當前數據庫中Tab1和db2.mdb(當前文件夾中)中Tab2以ID為關聯的所有記錄.
缺點-外部數據庫不能帶密碼.
補充:看到ugvanxk在一貼中的答復,可以用
Select * from [c:\aa\a.mdb;pwd=1111].table1;
ACCESS XP測試通過
在ACCESS中訪問其它ODBC數據源
下例在ACCESS中查詢SQLSERVER中的數據
SELECT * FROM Tab1 IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
外部數據源連接屬性的完整參數是:
[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]
其中的DRIVER=driver可以在注冊表中的
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\
中找到
異構數據庫之間導數據參見 碧血劍 的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS支持子查詢
ACCESS支持外連接,但不包括完整外部聯接,如支持
LEFT JOIN 或 RIGHT JOIN
但不支持
FULL OUTER JOIN 或 FULL JOIN
ACCESS中的日期查詢
注意:ACCESS中的日期時間分隔符是#而不是引號
Select * From Tab1 Where [Date]>#2002-1-1#;
在DELPHI中我這樣用
SQL.Add(Format(
'Select * From Tab1 Where [Date]>#%s#;',
[DateToStr(Date)]));
ACCESS中的字符串可以用雙引號分隔,但SQLSERVER不認,所以為了遷移方便和兼容,
建議用單引號作為字符串分隔符.
delphi讀取一個ACCESS數據庫中的表名

ADOConnection1.Close; ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + Edit1.Text + ';Persist Security Info=False'; ADOConnection1.Open; ADOConnection1.GetTableNames(ComboBox1.Items); ComboBox1.ItemIndex := 0;
delphi和access連接的方式

1.SQL數據庫的聯接方式: 條件:控件名:AdoConnecion1,數據庫名:Sample,用戶名:sa 密碼:123,數據庫地址:本機 AdoConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=Sample;Data Source=.'; Adoconnection1.LoginPrompt:=False; Adoconnection1.Connected:=True; 上面這段代碼為SQL數據庫的聯接方式:最后一句Data Source=. 其中的“.”表示為數據庫在本機,如果數據在其它地方,則將點改為IP地址或是服務器名稱。 2.ACCESS數據庫的聯接方式: 條件:Adoconnection1,數據庫名:Sample 密碼:123,數據庫文件路徑為程式存取的根目錄。 procedure TDataModule1.DataModuleCreate(Sender: TObject); var DbPath:String; begin DbPath:=ExtractFilePath(Application.ExeName)+'Sample.mdb'; Adoconnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=123;Data Source='+DbPath+';Persist Security Info=false'; Adoconnection1.LoginPrompt:=False; Adoconnection1.Connected:=True; end;
使用midas訪問遠程access數據庫

訪問遠程數據庫常用的辦法是使用大型數據庫自帶的客戶端工具,如SQL Server和Oracle等都帶有這樣的工具。帶對於Access這樣的小型數據庫,這種方法就無法使用了,因為Access不提供這樣的客戶端工具。但我們可以通過MIDAS實現訪問遠程Access數據庫。 MIDAS是Delphi提出的三層架構的解決方案。我提供的用MIDAS訪問遠程Access數據庫方法的基本思路是在服務器端建立供遠程訪問的數據模塊,而在客戶端通過MIDAS組件與其建立連接,並在客戶端發送SQL語句給服務器,服務器執行后返回數據集給客戶端。 具體做法為: 服務器端 服務器使用ADO控件訪問Access數據庫,具體是ADOConnection控件建立連接,ADOQuery執行相關操作。使用Data Access的ClientDataSet控件向客戶端返回數據集。並將以上控件放在Remote Data Module的容器中,供由客戶端進行連接。 有如下步驟: 1. 建立Application。其Form取名為FormServer,Project名為PrjServer; 2. FileàNewàOther…,在彈出的New Items對話框中選擇Multitier頁,在該頁中選擇Remote Data Module,確定; 3. 在彈出的Remote Data Module Wizard對話框中,在coclass一欄中填入AccessServer,Instancing與Threading Model保持默認,即表示不同線程之間互相獨立,確定后即生成一個RemoteDataModule的派生類AccessServer(在ViewàType Library中可以查看該類的詳細信息); 4. 在程序所在的文件夾中新建一個名為data的文件夾,在其下放入一個名為my.mdb的Access數據庫文件,其中有一個名為person的表,該表中只有兩個字段,分別為name和age,都是文本類型; 5. 遠程數據模塊AccessServer上放置各個控件,最終效果如下圖所示: 服務器遠程數據模塊 各控件的相關屬性與作用如下表所示: 控件類型 所屬頁面 屬性 值 作用 ADOConnection ADO name ADOConnection1 連接Access文件 ConnectionString Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\data\my.mdb;Persist Security Info=False ADOQuery ADO name ADOQuery1 執行相關查詢操作 Connection ADOConnection1 ClientDataSet Data Access name DataSetProvider1 向客戶端提供數據接口 DataSet ADOQuery1 Options. poAllowCommandText true 6. 編譯並運行該服務器程序。運行該程序即注冊了一個MIDAS的服務器,也只有在服務器程序運行的條件下,才能進行下一步的客戶端的程序開發。 客戶端 以DCOM方式與服務器端進行連接, 1. 建立Application。其Form取名為FormClient,Project名為PrjClient; 2. 在Form上放置各個控件,最終效果如下圖所示: 客戶端界面 各控件的相關屬性與作用如下表所示: 控件類型 所屬頁面 屬性 值 作用 Edit Stardard name txtQuery 接收查詢語句 Text select * from person Button Stardard name btnQuery DCOMConnection DataSnap name DCOMConnection1 通過DCOM方式連接服務器 ServerName PrjServer.AccessServer ClientDataSet Data Access name ClientDataSet1 向遠端發出SQL語句,並取得數據集 RemoteServer DCOMConnection1 ProviderName DataSetProvider1 DataSource Data Access name DataSource1 作為數據呈現控件的數據源 DataSet ClientDataSet1 DBGrid Data Controls name DBGrid1 顯示從遠端取回的數據集 DataSource DataSource1 說明: l DCOMConnection1的ServerName屬性是由列表中選取的,該列表是所有注冊的MIDAS服務器列表 l ClientDataSet1的ProviderName屬性指定的是服務器上的一個控件 3. 在Form上雙擊按鈕btnQuery,在其Click處理函數下加入如下一段代碼: self.ClientDataSet1.Close; self.ClientDataSet1.CommandText:=self.txtQuery.Text; self.ClientDataSet1.Open; 說明: 如果給出的是無返回的SQL語句,最后一句由Open改為Execute。 運行后,效果如下圖所示: 客戶端運行效果 改變客戶端的連接方式 在上面的例子中是用DCOM方式連接服務器,這一般只能在局域網內使用。如果要在廣域網內使用,可以改用Socket方式連接服務器。為此需做如下改動: 1. 在服務器端運行Delphi自帶的scktsrvr.exe程序,該程序在Borland\Delphi7\Bin\文件夾下 2. 在客戶端上用SocketConnection控件替換DCOMConnection控件,有關屬性的改動如下表所示: 控件類型 所屬頁面 屬性 值 作用 SocketConnection DataSnap name SocketConnection1 通過Socket方式連接服務器 Address 127.0.0.1(本機) ServerName PrjServer.AccessServer ClientDataSet Data Access RemoteServer SocketConnection1 向遠端發出SQL語句,並取得數據集 注意: SocketConnection的默認端口是211,這也是scktsrvr的默認端口。為此要在服務器端的防火牆上開放該端口