DELPHI中操作ACCESS技巧揭秘

    作者:数据库教程更新于: 2015-10-21 09:55:07

    下面是小编的数据库教程要介绍的DELPHI中操作ACCESS的具体内容。

    1.Delphi中操作Access数据库(建立.mdb文件,压缩数据库)
    以下代码在WIN2K,D6,MDAC2.6下测试通过,
    编译好的程序在WIN98第二版无ACCESS环境下运行成功.


    //声明连接字符串
    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不认,所以为了迁移方便和兼容,
    建议用单引号作为字符串分隔符.
    在SQLSERVER中查询ACCESS数据库中的表
    SELECT * FROM
    OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'c:\\youfile.mdb';'admin';'youpwd',youtabname)
    AS a
    以下SQL语句在ACCESS XP的查询中测试通过
    建表:
      Create Table Tab1 (
          ID Counter,
          Name string,
          Age integer,
          [Date] DateTime);
    技巧:
      自增字段用 Counter 声明.
      字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行.

    想了解更多数据库学习内容,可前往课课家官方网。

课课家教育

未登录