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不认所以为了迁移方便和兼容 建议用单引号作为字符串分隔符