一.ADO的动态数据库连接
procedure TDataModule2.DataModuleCreate(Sender: TObject); begin
ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Password=\"\";Data Source='+getcurrentdir+'\\house.mdb;Persist Security Info=False'; ADOConnection1.Open(); end;
其中getcurrentdir为获得当前路径的函数function GetCurrentDir: string;.
二.ADOQuery的动态创建和释放
1.先定义一个TADOQuery的变量Query; 2.创建Query :Query :=TADOQuery(self); 3.连接数据源 :Query.connection :=ADOConnection; 4.Query的SQL的清空 :Query.SQL.Clear;
5.Query的SQL语言的赋予:Query.SQL.Text或者Query.SQL.Add(); 6.Query的参数赋值:Query.Parameters.ParamByName(‘’).Vale; 7.Query的SQL语句的执行:Query.Open或者Query.ExecSQL; 8.Query的关闭:Query.Close; 9.Query的释放:Query.Free;
function TDataModule2.CheckUserName(username :string):boolean; var
Query :TADOQuery; //核查用户名 begin
Query :=TADOQuery.Create(self); Query.Connection :=ADOConnection1;
1
Query.SQL.Text :='select * from 用户表 where 用户名=:name'; Query.Parameters.ParamByName('name').Value :=username; Query.Open ;
if Query.RecordCount =1 then result :=true else
result :=false;
Query.Close ; Query.Free ; end; //密码的核查
function TDataModule2.CheckUserPassword(username,userpassword:string):boolean; var
Query :TADOQuery; begin
Query :=TADOQuery.Create(self); Query.Connection :=ADOConnection1;
Query.SQL.Text :='select * from 用户表 where 用户名=:name'; Query.Parameters.ParamByName('name').Value :=username; Query.Open ;
if Query.fieldByName('密码').Value =userpassword then result :=true else
result :=false;
Query.Close; Query.Free ;
end; //添加用户
function TDataModule2.AddUser(username,userpassword,jibie :string):boolean; var
Query :TADOQuery; begin
Query :=TADOQuery.Create(self); Query.Connection :=ADOConnection1;
Query.SQL.Clear ;
Query.SQL.Text :='insert into 用户表 (用户名,密码,级别) values (:name,:password,:jb)';
2
Query.Parameters.ParamByName('name').Value :=username;
Query.Parameters.ParamByName('password').Value :=userpassword; Query.Parameters.ParamByName('jb').Value :=jibie; Query.Prepared ;
try
ADOConnection1.BeginTrans; Query.ExecSQL ;
ADOConnection1.CommitTrans; result :=true; except
ADOConnection1.RollBackTrans; result :=false; end;
Query.Close ; Query.Free ; end;
//删除用户
function TDataModule2.DeleteUser(username,userpassword :string):boolean; var
Query :TADOQuery; begin
Query :=TADOQuery.Create(self); Query.Connection :=ADOConnection1;
Query.SQL.Clear ;
Query.SQL.Text :='delete from 用户表 where 用户名=:name and 密码=:password';
Query.Parameters.ParamByName('name').Value :=username;
Query.Parameters.ParamByName('password').Value :=userpassword; Query.Prepared ; Query.ExecSQL ;
try
ADOConnection1.BeginTrans ; ADOConnection1.CommitTrans ; result :=true; except
ADOConnection1.RollbackTrans; result :=false; end;
3
Query.Close ; Query.Free ; end;
//修改用户密码 function
TDataModule2.EditUserPassword(username,oldpassword,newpassword :string):boolean; var
Query :TADOQuery; begin
Query :=TADOQuery.Create(self); Query.Connection :=ADOConnection1;
Query.SQL.Clear ;
Query.SQL.Text :='update 用户表 set 密码=:newword where 用户名=:name and 密码=:oldword';
Query.Parameters.ParamByName('newword').Value :=newpassword; Query.Parameters.ParamByName('name').Value :=username;
Query.Parameters.ParamByName('oldword').Value :=oldpassword; Query.Prepared ;
try
ADOConnection1.BeginTrans; Query.ExecSQL ;
ADOConnection1.CommitTrans; result :=true; except
ADOConnection1.RollBackTrans; result :=false; end;
Query.Close ; Query.Free ; end; end.
三. ADOConnection的事务在ADOQuery执行中的使用
1.使用try….Except….End语句来控制执行结构;
2.ADOConnection事务的开始:ADOConnection.BeginTrans;
4
3.ADOQuery的执行;
4.ADOConnection事务的提交:ADOConnection.CommitTrans; 5.ADOConnection事务的回滚:ADOConnection.RollBackTrans;
try
ADOConnection1.BeginTrans;//事务的开始 Query.ExecSQL ; //执行
ADOConnection1.CommitTrans; //事务的提交 result :=true; except
ADOConnection1.RollBackTrans;//失败的话,事务回滚 result :=false; end;
四. ADOQuery一些对象、方法和属性的使用
1. ADOQuery.Parameters.ParamByName(Const value :WideString).Value用
来给SQL语句中的变量参数赋值;
2. ADOQuery.FieldByName(Const FieldName :String).as***,用来获得当前
ADOQuery所指的记录的字段值,其中***为字段的数据类型; 3. ADOQuery.Prepared是用来将SQL语句所用到的变量值传进去,即做
好执行的准备。
4. ADOQuery.Append 用来新增一个空白记录; 5. ADOQuery.Post 用来写将数据写入到数据库文件;
6. ADOQuery.FieldValues[const FieldName :string]用来获得当前记录的字
段值,其类型为Variant;
7. ADOQuery.IsEmpty判断记录是否为空;
五. 常用的SQL语句
5
1. Select Field1,Field2,…. From Table where express; 2. Update Table Set Field? =Value,Field??=Value where express; 3. Insert into Table (Field?,Field??,…) value (A,B,…); 4. Delete From Table Where express;
六. SQL参数的几种传递
1.ADOQuery1.SQL.Text :='select * from 来访表 where 来访日期=:A and
来访时间=结束时间';
ADOQuery1.Parameters.ParamByName('A').Value :=DateToStr(date); 2.ADOQuery1.SQL.Add('select * from 学生信息表 where 学号='''+Trim(Edit1.Text) +''''); 其中两个单引号代语句中的一个单引号。
七. 窗体的动态创建和释放
1. 窗体创Application.CreateForm(InstanceClass:TComponentClass,
var Reference);
2. 窗体的显示:Form.Show或者Form.ShowModal; 3. 窗体的释放:Form.Free;
Application.CreateForm(TForm14,Form14); Form14.ShowModal; Form14.Free ;
八. 编程经验和技巧点滴
6
1. Query.SQL.Text :='update 寝室表 set 实住人数=(实住人数+1),状态=:A
where 寝室号=:B';此语句中设当前一个字段的值为现在该字段的值加一个值构成一个新的值,这一定要打上个(),否则编译能通过,但不能执行得到正确的结果。
2. 控制读取的键盘数值来做文本框等的限制输入:
procedure TForm8.Edit5KeyPress(Sender: TObject; var Key: Char); begin
if not(Key in ['0'..'9',#8]) then begin
MessageBox(handle,'
只
能
输
入
数
字
','
警
',MB_OK+MB_ICONWARNING); Key :=#0; end; end;
3. 常用的几种类型转换:
DateToStr(DateTimePicker1.Date) ; StrToInt(trim(Edit2.Text)); IntToStr( );
StrToDateTimeDef(const S: string; const Default: TDateTime): StrToCurr(const S: string): Currency; StrToDate(const S: string): TDateTime; StrToDateTime(const S: string): TDateTime;
告
7
StrToFloat(const S: string): Extended; StrToInt64(const S: string): Int64; StrToTime(const S: string): TDateTime; function StrToCurr(const S: string): Currency; FloatToCurr(const Value: Extended): Currency; FloatToDateTime(const Value: Extended): TDateTime; FloatToStr(Value: Extended): string; TimeToStr(Time: TDateTime): string;
4. ADOQuery和DBGrid绑定时,DBGrid中的记录的改变会带动
ADOQuery中记录的变动,它们的变动是同步的,此时读取DBGrid中的当前数据时,可转化为读取ADOQuery中的当前数据。 5. ShowMessage(const Msg :string)
和MessageBox(hWand :HWND,IpText :PAsichar,IpCation :PAsichar,uType :Cardinal);
九. 数据库的备份与还原
function ExtractFilePath(const FileName: string): string;
// Returns the drive and directory portions of a file name.
function FileExists(const FileName: string): Boolean; //Tests if a specified(:具体指定) file exists.
8
function DeleteFile(const FileName: string): Boolean; //Deletes a file from disk.
function RenameFile(const OldName, NewName: string): Boolean; //Changes a file name.
procedure Sleep(milliseconds: Cardinal);
//Delay program execution for a specified number of microseconds.
1. 数据库的备份
procedure TForm1.BitBtn2Click(Sender: TObject); var
dbname :string; begin
if DataModule2.ADOConnection1.Connected=true then DataModule2.ADOConnection1.Connected :=false;
dbname:=ExtractFilePath(Application.ExeName )+'permis.bak'; if FileExists(dbname) then DeleteFile(dbname);
CopyFile(Pchar('house.mdb'),Pchar(dbname),true);
MessageBox(handle,'数据库备份成功!','提示',MB_OK+MB_ICONINFORMATION); if DataModule2.ADOConnection1.Connected=false then DataModule2.ADOConnection1.Connected :=true; end;
2. 数据库的还原
procedure TForm1.BitBtn3Click(Sender: TObject); var
dbname,dbbname :string; begin
9
if MessageBox(self.handle,'确认要还原数据么?','提示',MB_YESNO+MB_ICONINFORMATION)=IDYES then begin
if DataModule2.ADOConnection1.Connected =true then DataModule2.ADOConnection1.Connected :=false;
dbname:=ExtractFilePath(Application.ExeName )+'house.mdb'; dbbname:=ExtractFilePath(Application.ExeName )+'permis.bak'; if not FileExists(dbbname) then
MessageBox(self.Handle ,'没有备份的数据库,不能还原!','提示',MB_OK+MB_ICONINFORMATION) else begin
CopyFile(Pchar(dbbname),Pchar(dbname),true);
MessageBox(handle,'数据库还原成功!','提示',MB_OK+MB_ICONINFORMATION); end;
if DataModule2.ADOConnection1.Connected =false then DataModule2.ADOConnection1.Connected :=true;
end; end;
十. Access数据库的压缩
注:CreateOleObject(const ClassName)是个API,要在单元中申明uses comobj;才能通过编译。
procedure Sleep(milliseconds: Cardinal);
//Delay program execution for a specified number of microseconds.
procedure TForm1.BitBtn1Click(Sender: TObject); var
dbname :string; begin
if DataModule2.ADOConnection1.Connected =true then DataModule2.ADOConnection1.Connected :=false; Sleep(500);
10
dbname :=ExtractFilePath(Application.ExeName )+'house.mdb'; CompactAccess(dbname);
MessageBox(handle,'数据库压缩成功!','提示',MB_Ok+MB_ICONINFORMATION); if DataModule2.ADOConnection1.Connected =false then DataModule2.ADOConnection1.Connected :=true; end;
procedure TForm1.CompactAccess(dbName :string;JetId:string='4.0'); var
AVariant :Variant; begin
if FileExists(dbName+'.tmp') then DeleteFile(DbName+'.tmp'); AVariant := CreateOleObject('JRO.JetEngine');
AVariant.CompactDataBase('Provider=Microsoft.Jet.OLEDB.'+JetId+';Data Source='+ dbName,
'Provider=Microsoft.Jet.OLEDB.'+JetId+';Data Source='+dbName+'.tmp'); DeleteFile(DbName);
ReNameFile(dbName+'.tmp',DbName); end;
十一.Access数据库的加密
为了给Access数据库加密,首先关闭所使用的数据库程序,然后在
Access中以独占方式打开数据库,通过菜单"工具|安全|设置数据库密码"为数据库设置密码。在Delphi中,双击ADOConnection控件,然后单击Build….按键,在“提供者”页中选择“Microsoft Jet 4.0 OLE DB Provider”,然后单击下一步,在“连接”页中选择要连接的Access数据库的路径和数据库的文件名,这时单击“测试连接”按钮时,出现“初始化提供者时发生错误,测试连接失败,密码无效“的错误提示。此时应该单击”所有“页,然后双击”Jet OLE DB :Database Password”出现对话框,填入密码后,选择“连接”页中的“测试连接”按钮。如果出现“测试连接成功”的对话框则说明设置成功!
procedure TDataModule2.DataModuleCreate(Sender: TObject);
11
begin
ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+getcurrentdir+'\\house.mdb;Persist Security Info=True;Jet OLEDB:Database Password=hjp'; ADOConnection1.Open(); end;
十二.ListView的使用
procedure TForm1.BitBtn1Click(Sender: TObject); begin
ListView1.Items.Clear ; ADOQuery1.Close ; ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Text :='select * from 学生信息表'; ADOQuery1.Open;
while not ADOQuery1.Eof do begin
with ListView1.Items.Add do begin
caption :=ADOQuery1.fieldByName('学号').AsString ; SubItems.Add(ADOQuery1.fieldByName('姓名').AsString) ; SubItems.Add(ADOQuery1.fieldByName('性别').AsString) ;
12
SubItems.Add(ADOQuery1.fieldByName('系别').AsString) ; SubItems.Add(ADOQuery1.fieldByName('班级').AsString) ; end;
ADOQuery1.Next; end; end;
十三.动态创建控件
在动态创建的单元的uses中要加入要创建的控件所在单元。创建过
程中所要申明的变量最好在类的公有或私有域中申明,在var后申明的变量将占用系统堆栈空间,而在类的私有或公有域中申明的变量则只占用windows全局堆的空间,所谓全局堆是所有未占用的内存的集合。相对于全局堆,系统的堆栈要小,更为宝贵。而一般要动态创建控件的程序,动态创建的数量往往是比较多的,这就要消耗大量内存,所以从应用程序的性能出发,动态创建控件的变量最好在类中。
十四.窗体创建和显示的一些说明
1. 启动时创建窗体和运行时创建窗体的区别:窗体启动时创建是指这
13
CPageControl :=TPageControl.Create(self); //创建
CPageControl.Parent :=Form1;//要指定其父窗体,否则它是游离的 CPageControl.CapTion :=’fdds’;
CPageControl1.Name :=’dfdsf’;//必须给其命名
个窗体启动时由工程文件自动将这个窗体的代码部分加载到内存去。将一个窗体设为启动时创建往往是因为这个窗体使用的频率高,所以,为了加快使用这个窗体的速度,就在应用程序的运行过程中,让这个窗体一直加载在内存。而运行时创建窗体则是恰恰相反,窗体设为运行时创建往往是因为使用频率不高,其使用的速度也可以相应的慢一些,所以,这种窗体的使用方法是到使用时才将这个窗体加载到内存中去,然后使用它显示,最后,应该释放窗体所占用的资源。
2. 在 Delphi和C++Builder中窗体分自动创建(Auto-create)窗体和可用
(Aviailable)窗体。不管使用与不使用,自动创建窗体是应用程序一启动就创建的窗体,即使释放了对窗体的引用,也不会关闭此窗体,只有等到应用程序退出时,才将它们销毁。而可用窗体只有在要使用时才创建,在不使用时即可销毁它们。
3. Show和ShowModal:Show方法是来显示一个非模态(Modeless)窗
体,即把窗体的Visible属性设置为true,并把窗体移到屏幕最前面。 ShowModal方法是来显示一个模态(Model)窗体。当一个窗体用模态状态显示时,只有把此窗体关闭后,应用程序才能执行其它部分的代码。
4. 窗体的KeyPreview属性: KeyPreview属性规定了窗体是否先于活动
组件获取键盘事件。当KeyPreview属性设为false时,拥有输入焦点的控件将接收所有的键盘事件。当KeyPreview属性设为true时,先由窗体接收键盘事件,后才是拥有输入焦点的控件接收键盘事
14
件。
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin
Key :=UpCase(Key);//将键盘输入的键转为大写的,此时获得 end;
十五.命令按钮的ModalResult属性
该属性决定此按钮是否或如何关闭它的父窗体(此窗体必须是模态窗体)。通过设置命令按钮的ModalResult属性来关闭一个模态窗体是一个简捷的方法。当一个按钮被单击后,该组件的父窗体的ModalResult属性被设置为此按键的ModalResult属性的值,例如一个对话框中有一个“确定”按钮和一个“取消”按钮,我们只需要把它们的ModalResult属性分别设置为mrOK和MrCancel。在运行期间,单击“确定”按钮就会把对话框的ModalResult属性设置为mrOK;单击“取消”按钮就会把对话的ModalResult属性设置为mrCancel。除非要进一步的处理,否则根本无须为这两个按钮编写OnClick事件响应函数的代码。
十六.值得注意的一点
当一个可聚集的控件的Enable设为假时,它便不能再接受的焦点了,比
//焦点的Edit1.text将接收和是大写的字符了
如:Edit.Enable :=false; Edit.SetFourse便会发生错误!
15
因篇幅问题不能全部显示,请点此查看更多更全内容