zoukankan      html  css  js  c++  java
  • 【转载】ACCESS技巧集(DELPHI AND SQL)

    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
    //=============================================================================

    //取得临时文件名
    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;


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

    ACCESS的约束
    在JET SQL参考中关于约束的内容不够详细,可以参考SQL Server的联机丛书
    下面的SQL为a表的Name字段增加非空约束
    ALTER TABLE a ADD CONSTRAINT a_checkname CHECK (Not [Name] is Null)
    注意:每一个约束都是一个对象,都有一个名字

    为一个表设置主键
    下面的语句把id列设置为主键
    Alter Table [表] Add Primary Key (Id)
    下面的语句把id列改为自动编号类型,并且设置为主键
    Alter Table [表] Alter [id] Counter Constraint [表_p] Primary Key

    修改ACCESS数据库的密码
    //引用ComObj单元

    //=============================================================================
    // Procedure: ChangeAccessPassword
    // Author   : ysai
    // Date     : 2004-02-10
    // Arguments: const AFileName : string; const AOldPassword : string; const ANewPassword : string
    // Result   : Boolean
    //=============================================================================

        const AFileName : string;
        const AOldPassword  : string;
        const ANewPassword  : string
        ):Boolean;

    const
      SAlterDatabasePassword  = 'ALTER DATABASE PASSWORD %s %s';
    var
      acn   : OleVariant;
      sOld  : string;
      sNew  : string;
    begin
      if AOldPassword = '' then
        sOld  :=  'Null'
      else
        sOld  :=  '[' + AOldPassword + ']';
      if ANewPassword = '' then
        sNew  :=  'Null'
      else
        sNew  :=  '[' + ANewPassword + ']';
      try
        acn :=  CreateOleObject('ADODB.Connection');
        //Delphi中的cmShareExclusive,ADO中的adModeShareExclusive
        //用排它方式打开,直接用数字可以不用引用ADO单元
        acn.Mode  :=  12;
        acn.Provider := 'Microsoft.Jet.OLEDB.4.0';
        acn.Properties('Jet OLEDB:Database Password') := AOldPassword;
        acn.Open('Data Source=' + AFileName);
        try
          acn.Execute(Format(SAlterDatabasePassword,[sNew,sOld]));
        finally
          acn.Close;
        end;
        Result  :=  True;
      except
        Result  :=  False;
      end;
    end;

  • 相关阅读:
    Nuget~打包时添加powershell初始化脚本
    ELK系列~对fluentd参数的理解
    arclistsg独立单表模型文档列表
    arcpagelistarclist列表分页
    autochannel 指定栏目
    ini文件解析c库(iniparser)
    POJ 1386 有向图欧拉通路
    最好用的20个数据可视化工具(四)
    各种语音编码总结
    struts2讲义----二
  • 原文地址:https://www.cnblogs.com/spider518/p/1921296.html
Copyright © 2011-2022 走看看