怎样在连接数据库的时候可以操作???(50分)

  • 主题发起人 主题发起人 死灰
  • 开始时间 开始时间

死灰

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库:Oracle 8.17
当连接数据库的时候有一段时间是需要等待的,并且哪段时间内Form不能操作..
也就不能取消连接.只有等连接结束后才能操作.
我需要运行的结果是可以点击连接,然后可以操作取消连接..
下面是我的代码..运行结果跟不用线程是一样.也是在连接时候是停顿的..
是不是代码写错了.
有没有写好的程序发我看看?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Buttons, ExtCtrls, DB, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Memo1: TMemo;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TTThread = class(TThread)
private
TADOconn: TADOConnection;
procedure ConnectDB;
protected
procedure Execute;override;
public
constructor Create(ADOConnection: TADOConnection);
published
destructor Destroy;
override;
end;

var
Form1: TForm1;
Hread: TTThread;
implementation
{$R *.dfm}
{ TThread类的实现 }
constructor TTThread.Create(ADOConnection: TADOConnection);
begin
inherited Create(true);
FreeOnTerminate := true;
TADOconn := ADOConnection;
Suspended := false;
end;
procedure TTThread.Execute ;{ 执行线程的方法 }
begin

Synchronize(ConnectDB);
// Setup the ProgressBar
end;

procedure TTThread.ConnectDB;
// Update ProgressBar
begin

try
form1.Memo1.Text := 'Connected....';//不会显示..必须通过form1.refresh才会显示.
TADOconn.Connected := true;
// 连接
form1.Memo1.Text := 'Connected';
except
form1.Memo1.Text := 'Connect Error';
end;
end;
destructor TTThread.Destroy;
begin
inherited destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Hread := TTThread.Create(ADOConnection1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
hread.Suspend ;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
hread.Resume ;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Hread.Terminate ;
{ 销毁之前终止线程执行 }
Hread := nil;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if Hread = nil then
showmessage('nil');
end;

end.
 
请祥述问题!
不明白你的意思!
是库?还是表?
 
//当连接数据库的时候有一段时间是需要等待的,并且哪段时间内Form不能操作..
//也就不能取消连接.只有等连接结束后才能操作.
是连接数据库的时候呀...连呀...
 
Synchronize(ConnectDB)
你把ConnectDB同步就是把它放在主线程中执行,所以执行ConnectDB时你不能响应
其它消息,其实你只需要把会造成线程冲突的同步就行了
 
同楼上,用Synchronize
 
你这个和不用线程没有任何区别,还是主线程连接的数据库
我也试了一下,好像根本就不能在线程中用ADO连接数据库,
总是报告:“标记没有引用存储” 的错误信息
 
是呀.连接数据库必须用Synchronize,...
更新数据库也必须用这个..
假如用线程更新数据时候拔掉网线或者主机死机程序也会一样锁死.要等待几十秒.
当然用事务处理数据是不会出错的..
迷糊:如何做到线程同步啊?也就是当连接数据库的时候可以操作.又或者更新数据时候主机死机可以操作终止线程.不用在干等待..
 
如果操作都用‘Synchronize来完成,那么用线程和不用线程实在是没有区别的,
我想问的是:
在线程中怎么是用ADO来连接数据库呢?
BDE的我会,但是这个怎么办?
 
是谁在这里散布“连接数据库必须用Synchronize”这种低级谣言的?
为什么不亲身验证一下导致失败的原因呢?!
只要看一看那个出错信息,就会发现原来事情是多么的简单!!!!!!!!
呵呵,提示一下:
只要在 ADOConnection.Connected := True;
之前,调用一次 ActiveX.coInitialize(nil);
看明白了吗?写得再浅白一些:
ActiveX.coInitialize(nil);
ADOConnection.Connected := True;
唉!只知其然,而不知其所以然!难怪简单问题都如此一筹莫展。
 
ActiveX是什么对象啊?
AdoConnection和DBExpress是否都是线程安全的呢?
 
to:死灰
我的意思是连接数据库时不要同步,否则就是在主线程中执行,那此时肯定不能执行其
它操作了。
我觉得adoconnection应该是线程不安全,所以我觉得应该线程中创建adoconnection,
这样就不至于和其他线程冲突。
to::gztomash
真的只知其然,而不知其所以然,能不能给讲讲,谢了先
 
噢!晕了!
简单来说,只是ActiveX要求对每个使用它的线程做初始化。
ActiveX.coInitialize 就是ActiveX单元的coInitialize函数,
并非只有对象才可以有 X.Y 这样的写法的。
ADO是否线程安全,好像在ADO的MSDN说明里面也没有直接提及,
我一般是为每一个线程创建一个独立的Connection,这就是最保险的做法。
至于DBExpress,我从来不用。
至于这个例子,只是想通过一个后台线程处理数据库连接,
只要保证在连接成功之前不使用这个Connection,绝对是安全的。
 
可以了.
uses ActiveX
ActiveX.coInitialize(nil);
ADOConnection.Connected := True;
或者不uses ActiveX
Application.initialize;
ADOConnection.Connected := True;
可是新的问题又来了.如何未结束线程手动消萎线程释放内存啊??
hread.Suspend ;
hread.Resume ;
没有问题..
不知道如何终止..
问题多多.请不要见怪.谢谢你们热心帮助....
 
ActiveX是个单元,相当于一个命名空间,(呵呵,简单的命名空间Delphi中早有了)
我想着就是需要初始化,但是忘了这个函数在哪个单元了
 
噢..看来没有答案了..查了很多资料.发现好象解决不了..
而且试了连接前
TADOconn.ConnectOptions := coAsyncConnect;
终止线程前Hread.TADOconn.Cancel;
这样线程可以正常终止.但通过防火场发现哪个TADOconn还在连接中..
并且对TADOconn操作时程序会锁死.直到连接结束时候才会释放.
开始以为是ORACLE的OLEDB有问题..装了OraOLEDB_81730问题还是一样..
不知道长时间查询用户可以强行中断可不可以?查了这里论坛的一些留言好象最后都是没有什么结果.
算了..再没有人解答就结束了..
呵呵..我分数不多..唯有再次多谢大家热心帮忙.
 
多人接受答案了。
 
后退
顶部