《2022年DELPHI中操作ACCESS数据库 .pdf》由会员分享,可在线阅读,更多相关《2022年DELPHI中操作ACCESS数据库 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、DELPHI中操作 ACCESS 数据库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: GetTempPath
2、FileName / Author : ysai / Date : 2003-01-27 / Arguments: (None) / Result : string /= function GetTempPathFileName():string; / 取得临时文件名var SPath,SFile:array 0.254 of char; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - begin GetTempPath(25
3、4,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; / 建
4、立 Access 文件,如果文件存在则失败var STempFileName:string; vCatalog:OleVariant; begin STempFileName:=GetTempPathFileName; try 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - vCatalog:=CreateOleObject(ADOX.Catalog); vCatalog.Create(format(SConnectionSt
5、ring,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 CompactData
6、base(AFileName,APassWord:string):boolean; / 压缩与修复数据库 , 覆盖源文件var STempFileName:string; vJE:OleVariant; begin 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - STempFileName:=GetTempPathFileName; try vJE:=CreateOleObject(JRO.JetEngine); vJE.Co
7、mpactDatabase(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 : 20
8、03-01-27 / Arguments: AFileName,AOldPassWord,ANewPassWord:string / Result : boolean /= function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - / 压缩数据库并修改 ACCESS 数
9、据库密码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(AFi
10、leName),false); DeleteFile(STempFileName); except result:=false; end; end; 2.ACCESS 中使用 SQL语句应注意的地方及几点技巧以下 SQL语句在 ACCESS XP 的查询中测试通过建表: Create Table Tab1 ( ID Counter, Name string, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - Age intege
11、r, Date DateTime); 技巧: 自增字段用 Counter 声明. 字段名为关键字的字段用方括号 括起来 , 数字作为字段名也可行 . 建立索引 : 下面的语句在 Tab1的 Date 列上建立可重复索引 Create Index iDate ON Tab1 (Date); 完成后 ACCESS 中字段 Date 索引属性显示为 - 有( 有重复 ). 下面的语句在 Tab1的 Name 列上建立不可重复索引 Create Unique Index iName ON Tab1 (Name); 完成后 ACCESS 中字段 Name 索引属性显示为 - 有( 无重复 ). 下面的语
12、句删除刚才建立的两个索引 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
13、名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 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 子句: Sel
14、ect 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:aaa.mdb;pwd=1111.table1; ACCESS XP 测试通过在 ACCESS 中访问其它 ODBC 数据源下例在 ACCESS 中查询 SQLSERVER中的数据 SELECT * FROM Tab1 IN ODBC
15、 ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo; 外部数据源连接属性的完整参数是: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password; 其中的 DRIVER=driver 可以在注册表中的 HKEY_
16、LOCAL_MACHINESOFTWAREODBCODBCINST.INI 中找到异构数据库之间导数据参见碧血剑 的http:/ 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 Wher
17、e Date#%s#;, DateToStr(Date); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - ACCESS 中的字符串可以用双引号分隔, 但 SQLSERVER不认, 所以为了迁移方便和兼容, 建议用单引号作为字符串分隔符. ACCESS 的约束在 JET SQL参考中关于约束的内容不够详细, 可以参考 SQL Server的联机丛书下面的 SQL为 a 表的 Name 字段增加非空约束ALTER TABLE a
18、 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 :
19、ysai / Date : 2004-02-10 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - / Arguments: const AFileName : string; const AOldPassword : string; const ANewPassword : string / Result : Boolean /= function ChangeAccessPassword( const AFileName :
20、 string; const AOldPassword : string; const ANewPassword : string ):Boolean; / 修改 ACCESS 数据库密码 , 必须独占打开数据库 , 使用前请确保没有其他程序使用数据库const SAlterDatabasePassword = ALTER DATABASE PASSWORD %s %s; var acn : OleVariant; sOld : string; sNew : string; begin if AOldPassword = then sOld := Null else sOld := + AOl
21、dPassword + ; if ANewPassword = then sNew := Null 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - else sNew := + ANewPassword + ; try acn := CreateOleObject(ADODB.Connection); /Delphi中的 cmShareExclusive,ADO 中的 adModeShareExclusive /用排它方式打
22、开 , 直接用数字可以不用引用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; en
23、d; end; 添加复合主键下面的SQL为 tb_demo表添加复合主键 (id,id2). Alter Table tb_demo Add Constraint tb_demo_pk Primary Key (id,id2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -