ACCESS技巧集 作者:ysai 转载请保持文章完整并标明出处
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',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,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 声明.? 字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行.???
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|