delphi ACCESS技巧集


本文整理自网络,侵删。

 作者:ysai 
转载请保持文章完整并标明出处 
1.DELPHI中操作ACCESS数据库(建立.mdb文件,压缩数据库) 
以下代码在WIN2K,D6,MDAC2.6下测试通过, 
//声明连接字符串 
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(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
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为关联的所有记录. 
缺点-外部数据库不能带密码. 
在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\ 
中找到 
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不认,所以为了迁移方便和兼容, 
建议用单引号作为字符串分隔符.   
4、很长的文本文件?文本文件最大也就是64k呀,不正好合适吗?如果是很大的文档,假设有一百几十M那么多,你认为这样有存入access的必要吗?不怕撑死它呀??这种情况下,我觉得,存个路径比整个存进去要效率高得多。

相关阅读 >>

Delphi 无法调用cmd nbtstat命令解决办法

Delphi xe 跨平台(windows、android安卓、苹果macos、苹果ios)写法

Delphi android实例-trectangle加载图片(xe8+小米2)

Delphi 正则表达式tperlregex 类的属性与方法

Delphi xe5 android程序常用的unit

Delphi 标题栏相关操作

Delphi消息发送字符串

Delphi tscreen 类 - 通过 screen 更换光标

Delphi 生成不重复数字随机码

firemonkey 手机 app 的手势

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    正在狠努力加载,请稍候...