ADOQuery问题????!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

wsh1688 2003-10-09 09:35:17
我设置数据查询进度时出现问题

只能其中一个数据库查询才出现进度,其他的数据库都不出现,是不是数据库

本身的问题呢??!~~
...全文
89 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
47522341 2003-10-09
  • 打赏
  • 举报
回复
是不是其他的数据库查询时用的时间太少了;来不及显示进度条;
mxk19791116 2003-10-09
  • 打赏
  • 举报
回复
是程序的问题
angle097113 2003-10-09
  • 打赏
  • 举报
回复
只能说是不可能的再看看你的代码吧
wsh1688 2003-10-09
  • 打赏
  • 举报
回复
数据库都是一样,都是mdb数据库呀!~~~~~~~~
hatedeadlock 2003-10-09
  • 打赏
  • 举报
回复
没有 这是以前写的 自己用来 同步查询的

如果按照你刚才说的 用不同的数据库 有些可以有些不可以

好象就应该不是 这个问题了

一般来说 创建一个PROJECT 运行他 VCL就会创建了一条主线程
在这个PROJECT 中如果有那些处理过程 还在处理的时候
系统对其他的处理只能挂起
wsh1688 2003-10-09
  • 打赏
  • 举报
回复
哦非常感谢

但是你这个方法有些太麻烦啦
hatedeadlock 2003-10-09
  • 打赏
  • 举报
回复
ADOQuery1.ADOQuery1FetchProgress=ADOQuery1FetchProgress
hatedeadlock 2003-10-09
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
Session1: TSession; { 属性SessionName填写为S1 }
Database1: TDatabase; { 属性SessionName选择为S1 }
Query1: TQuery;{ 属性Database选择为Database1;属性SessionName选择为S1 }
DataSource1: TDataSource; { 属性DataSet设置为空 }
DBGrid1: TDBGrid; { 属性DataSource选择为DataSource1 }
Session2: TSession; { 属性SessionName填写为S2 }
Database2: TDatabase; { 属性SessionName选择为S2 }
Query2: TQuery;{ 属性Database选择为Database2;属性SessionName选择为S2 }
DataSource2: TDataSource; { 属性DataSet设置为空 }
DBGrid2: TDBGrid; { 属性DataSource选择为DataSource2 }
BtnGoPause: TButton; { 用于执行和挂起线程 }
procedure FormCreate(Sender: TObject); { 创建窗体时创建线程对象 }
procedure FormDestroy(Sender: TObject); { 销毁窗体时销毁线程对象 }
procedure BtnGoPauseClick(Sender: TObject); { 执行线程和挂起线程 }
private
public
end;

TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query: TQuery;
DataSource: TDataSource); virtual; { 线程构造器 }
end;

var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery; { 线程查询对象2 }

implementation

{$R *.DFM}

{ TThreadQuery类的实现 }

{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error'); { 线程异常 }
end;
end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TQuery; DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;

{ 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;

{ 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate; { 销毁之前终止线程执行 }
Q2.Destroy;
end;

{ 开始线程、继续执行线程、挂起线程 }
procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
if Q2.Suspended then Q2.Resume else Q2.Suspend;
end;

end.

这个对你有帮助的! 试试 用多线程
将 procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
共享 (sender as TADOQuery)来代替执行
wsh1688 2003-10-09
  • 打赏
  • 举报
回复
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from MainTable');
ADOQuery1.Open;

我就换了一个数据库,马上就不行啦

但是换过来他就好啦!~~

奇怪
hatedeadlock 2003-10-09
  • 打赏
  • 举报
回复
你肯定是单线程!
wsh1688 2003-10-09
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls, ComCtrls,
TFlatProgressBarUnit;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
FlatProgressBar1: TFlatProgressBar;
procedure Button1Click(Sender: TObject);
procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from MainTable');
ADOQuery1.Open;
end;

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
FlatProgressBar1.Position := Progress*100 div maxProgress;
label1.Caption := IntToStr(Progress);
label2.Caption := IntToStr(maxProgress);
Application.ProcessMessages;
end;

end.
wsh1688 2003-10-09
  • 打赏
  • 举报
回复
不是呀,就是时间太少进度也应该到头的呀!~

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧