Delphi连接sql数据库过程界面会卡死怎么办
9个回答
2016-04-15
展开全部
可以尝试如下作法:
1. 自定义一个类,ADOConnection、ADOQUERY为其成员域成员动态创建;
2. 启动线程去执行连接操作;此线程有一标志,当连接有结果(成功或失败)后置TRUE;
3. 界面单元调用此线程,WHILE判断线程标志为TRUE时,说明连接有结果。
while not customerThread.flag do begin
application.ProcessMessages.
end;
1. 自定义一个类,ADOConnection、ADOQUERY为其成员域成员动态创建;
2. 启动线程去执行连接操作;此线程有一标志,当连接有结果(成功或失败)后置TRUE;
3. 界面单元调用此线程,WHILE判断线程标志为TRUE时,说明连接有结果。
while not customerThread.flag do begin
application.ProcessMessages.
end;
金山毒霸
2024-10-31 广告
2024-10-31 广告
电脑在启动游戏或软件的时候,桌面弹出错误提示框“0xc0000094”,应该怎么办?电脑报错,很大可能是因为某些DLL文件出现了异常,比如感染了病毒、DLL文件丢失等。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的...
点击进入详情页
本回答由金山毒霸提供
展开全部
是这样的,你这个连接sql数据库过程,我可以认为是一个耗时过程,
就是连接的过程会卡死,但是连接完成后,界面就恢复正常了,对吧?
那我就说下这个问题,在我们开发程序的时候,总是会遇到耗时过程,
这种操作如果在界面还显示的情况下,同时这个耗时过程是在主线程中进行的,
那么确实会卡死,所以你要做的应该是
增加进度条(如果连接过程是分多句执行的,那么,可以在主线程中增加观察者,观察子线程中的连接过程,连接过程每走几句,可以刷新一次进度条,如果一句内卡住,那么就得改进度条样式,变为没有百分比的样式)
耗时过程在子线程中处理(如果主线程中有为维护进度条增加的观察者的方法,也要维护)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
原因:a) 检索SQL实例过程导致卡死
b)TADOConnection连接SQL数据库超时卡死
解决办法:针对情况a,我们可以通过指定实例,指定设备名(或者指定IP地址);
针对情况b,我们可以通过设置TADOConnection.CommandTimeout参数来限定等待时间,同时嵌套try except 捕获异常处理;
示例代码:TADOConnection的连接字符:Provider=SQLOLEDB.1;Password=usrname;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=127.0.0.1\SQL2008;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False
连接代码:
try
con1.ConnectionString := Format(AConStr, [FGetLocalName]);
con1.CommandTimeout =1000;
con1.Connected:=True;
except
{异常处理}
end
b)TADOConnection连接SQL数据库超时卡死
解决办法:针对情况a,我们可以通过指定实例,指定设备名(或者指定IP地址);
针对情况b,我们可以通过设置TADOConnection.CommandTimeout参数来限定等待时间,同时嵌套try except 捕获异常处理;
示例代码:TADOConnection的连接字符:Provider=SQLOLEDB.1;Password=usrname;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=127.0.0.1\SQL2008;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False
连接代码:
try
con1.ConnectionString := Format(AConStr, [FGetLocalName]);
con1.CommandTimeout =1000;
con1.Connected:=True;
except
{异常处理}
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
卡死是肯定的,因为主线程被占用,所以出现没有相应的情况,要解决可以考虑delphi封装的Tthread来做,不过最好用匿名线程,我认为最简便。
我这没有数据库,可以参考:
Tthread.CreateAnonymousThread(
procedure begin
//这里写上查询语句
end
) .start;
我这没有数据库,可以参考:
Tthread.CreateAnonymousThread(
procedure begin
//这里写上查询语句
end
) .start;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个经验告诉你。
Delphi或BCB对SQL数据库进行数据的联接或处理时,每次(批)数据库的指令操作之间必需有一定的间隔,否则极易出现“卡死”或数据错漏的情况。
这个卡死是因为SQL服务器反应不过来,还是本地程序反应不过来就不确定了,我的做法是每步操作间进行一定的延时,一般非大量重复的工作延时1秒左右,大量重复的工作延时0.1秒左右(要根据实测情况进行调整)。
Delphi或BCB对SQL数据库进行数据的联接或处理时,每次(批)数据库的指令操作之间必需有一定的间隔,否则极易出现“卡死”或数据错漏的情况。
这个卡死是因为SQL服务器反应不过来,还是本地程序反应不过来就不确定了,我的做法是每步操作间进行一定的延时,一般非大量重复的工作延时1秒左右,大量重复的工作延时0.1秒左右(要根据实测情况进行调整)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询