我用Delphi5写了个用ADOQuery对Access2000数据库操作的测试程序,没有想到遇到一个很奇怪的问题,希望大侠们帮助看看,到底是怎么回事?
开发环境:
Delphi5+Windows98+Access2000
程序描述:
Form1上有如下几个控件:
DBGrid1, DataSource1, ADOQuery1, ADOQuery2,Button_Refresh, Button_Insert
数据库描述:
用Access2000创建了一个数据库E:\temp\db.mdb,
只有一张表create table temp(A char(10),B char(10))
问题描述:
Button_Refresh的OnClick事件是将DBGrid1通过DataSource1和ADOQuery1将表temp的数据显示出来;Button_Insert的OnClick事件是向表temp插入一条记录;程序运行后,先点Button_Refresh将数据库的表temp显示;再点Button_Insert向表Temp插入一条记录;
注意:在Button_InsertClick中,插入记录后,我立即调用Button_RefreshClick(self)来刷新数据,可是DBGrid1却没有将表temp的记录数据刷新,仍然显示插入记录前的记录,等过2到3秒后我手工点Button_Refresh,这个时候DBGrid1才将表temp的记录全部显示出来(包括刚插入的新记录),也就是说,这里出现了一个延迟!
百思不得其解!希望大侠们研究一下,究竟是怎么回事?
是程序有问题?还是Access2000的BUG?
还是其他的原因:
例如:我没有用ADOConnection来连接数据库?等等最后想再问一个问题:
如何用Delphi来对Access数据库进行创建(包括表)、备份、恢复? ---------进步才是硬道理[email protected]附源程序:
//////////////////////////////////////////////////////////////////unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, ADODB;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
Button_Insert: TButton;
Button_Refresh: TButton;
procedure Button_InsertClick(Sender: TObject);
procedure Button_RefreshClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button_InsertClick(Sender: TObject);
begin
with ADOQuery2 do
begin
ADOQuery2.ConnectionString:=ADOQuery1.ConnectionString;
ADOQuery2.close;
ADOQuery2.sql.clear;
ADOQuery2.sql.add('insert into temp(a,b) values(:a,:b)');
ADOQuery2.Parameters.ParamByName('a').value:='aaa';
ADOQuery2.Parameters.ParamByName('b').value:='bbb';
try
ADOQuery2.ExecSQL;
ShowMessage('Insert 成功');
except
ShowMessage('Insert 失败');
end;
end;
Button_RefreshClick(self);//刷新数据集
end;
procedure TForm1.Button_RefreshClick(Sender: TObject);
begin
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=ADOQuery1;
ADOQuery1.ConnectionString:=' Provider=Microsoft.Jet.OLEDB.4.0;'
+' Data Source=E:\temp\db.mdb;'
+' Persist Security Info=False ';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(' select A,B from temp ');
ADOQuery1.open;
end;end.
/////////////////////////////////////////////////////////////////////
开发环境:
Delphi5+Windows98+Access2000
程序描述:
Form1上有如下几个控件:
DBGrid1, DataSource1, ADOQuery1, ADOQuery2,Button_Refresh, Button_Insert
数据库描述:
用Access2000创建了一个数据库E:\temp\db.mdb,
只有一张表create table temp(A char(10),B char(10))
问题描述:
Button_Refresh的OnClick事件是将DBGrid1通过DataSource1和ADOQuery1将表temp的数据显示出来;Button_Insert的OnClick事件是向表temp插入一条记录;程序运行后,先点Button_Refresh将数据库的表temp显示;再点Button_Insert向表Temp插入一条记录;
注意:在Button_InsertClick中,插入记录后,我立即调用Button_RefreshClick(self)来刷新数据,可是DBGrid1却没有将表temp的记录数据刷新,仍然显示插入记录前的记录,等过2到3秒后我手工点Button_Refresh,这个时候DBGrid1才将表temp的记录全部显示出来(包括刚插入的新记录),也就是说,这里出现了一个延迟!
百思不得其解!希望大侠们研究一下,究竟是怎么回事?
是程序有问题?还是Access2000的BUG?
还是其他的原因:
例如:我没有用ADOConnection来连接数据库?等等最后想再问一个问题:
如何用Delphi来对Access数据库进行创建(包括表)、备份、恢复? ---------进步才是硬道理[email protected]附源程序:
//////////////////////////////////////////////////////////////////unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, ADODB;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
Button_Insert: TButton;
Button_Refresh: TButton;
procedure Button_InsertClick(Sender: TObject);
procedure Button_RefreshClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button_InsertClick(Sender: TObject);
begin
with ADOQuery2 do
begin
ADOQuery2.ConnectionString:=ADOQuery1.ConnectionString;
ADOQuery2.close;
ADOQuery2.sql.clear;
ADOQuery2.sql.add('insert into temp(a,b) values(:a,:b)');
ADOQuery2.Parameters.ParamByName('a').value:='aaa';
ADOQuery2.Parameters.ParamByName('b').value:='bbb';
try
ADOQuery2.ExecSQL;
ShowMessage('Insert 成功');
except
ShowMessage('Insert 失败');
end;
end;
Button_RefreshClick(self);//刷新数据集
end;
procedure TForm1.Button_RefreshClick(Sender: TObject);
begin
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=ADOQuery1;
ADOQuery1.ConnectionString:=' Provider=Microsoft.Jet.OLEDB.4.0;'
+' Data Source=E:\temp\db.mdb;'
+' Persist Security Info=False ';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(' select A,B from temp ');
ADOQuery1.open;
end;end.
/////////////////////////////////////////////////////////////////////
最好在程序一开始运行时建立连接,以后
的dataset直接建立与adoconnection的连接即可,
不必每次操作都要建立连接.ok
上分,谢谢!!!!
begin
DBGrid1.DataSource:=DataSource1;
DataSource1.DataSet:=ADOQuery1;
//没有必要再次设置
ADOQuery1.ConnectionString:=' Provider=Microsoft.Jet.OLEDB.4.0;'
+' Data Source=E:\temp\db.mdb;'
+' Persist Security Info=False ';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(' select A,B from temp ');
ADOQuery1.open;
end;静态创建的控件绑定到数据库后如果没有改变就没有必要在程序中再链接数据库 ,一般用一个ADOConnection ,然后用ADOQuery连接 。
参数查询较费时
刷新数据可以在一个事件中 Close 然后 Open 即可 ;
不知道ACCESS支持的Sql语句情况,在Sql Server 2000中,可以这样备份与恢复:
BACKUP DATABASE DataBaseName
TO DISK = 'c:\myback.bak'
将数据库备份到c:\myback.bak文件;RESTORE DATABASE DataBaseName
FROM DISK = 'c:\myback.bak'
从c:\myback.bak中恢复数据库
因为在显示上花费了大量的时间 记住这一点