注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

鑫淼梦园的博客

圆你的梦想 从这里开始

 
 
 

日志

 
 

DELPHI中操作ACCESS数据库  

2013-08-16 12:13:25|  分类: delphi xe4 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
2011-10-27 12:14 59人阅读 评论(0) 收藏 举报
 

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

  评论这张
 
阅读(245)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017