我往Splitter数据表里写入数据后启动线程,线程的作用主要是查询Splitter数据表中符合条件的记录数,如果达到一定的记录数,则将所有数据拼合起来。线程定义如下: type
TSplitterThread = class(TThread)
private
TMobileNo : String;
TJunoId : String;
TAllColumn: Integer;
protected
procedure Execute; override;
public
constructor Create(MobileNo: String; JunoId: String; AllColumn: Integer); virtual;
end;启动线程部分代码如下:
procedure A;
...
// tblSplitter 为ADOTable 控件,对Splitter表进行操作
with tblSplitter do begin
Active := True; Append;
{ 此处代码为插入数据 }
Active := False;
end;
// 启动线程
thrdSplitter := TSplitterThread.Create(strMobileNo, strJunoId, iAllColumn);
Sleep(2000);
...
end;执行线程操作部分代码如下:
procedure B;
// qrySplitter 为ADOQuery 控件,同样是对Splitter表进行操作
// 就是以下操作经常提示错误
with frmMain.qrySplitter do begin
SQL.Clear;
SQL.Add('SELECT DISTINCT * FROM [Splitter]');
SQL.Add('WHERE ([MobileNo]=''' + TMobileNo + ''')');
SQL.Add('AND ([JunoId]=''' + TJunoId + ''')');
SQL.Add('AND ([AllColumn]=' + IntToStr(TAllColumn) + ')');
SQL.Add('ORDER BY [NowColumn]');
Active := True;
end;
end;但是在procedure B中,错误信息为“Cannot perform this operation on a closed dataset”,如果去掉Sleep(2000)和将SQL语句的DISTINCT去掉,则不会出现这个错误,但是数据是乱的,就是拼合不正确,请问多线程的原理是什么?这段代码应该如何改?
TSplitterThread = class(TThread)
private
TMobileNo : String;
TJunoId : String;
TAllColumn: Integer;
protected
procedure Execute; override;
public
constructor Create(MobileNo: String; JunoId: String; AllColumn: Integer); virtual;
end;启动线程部分代码如下:
procedure A;
...
// tblSplitter 为ADOTable 控件,对Splitter表进行操作
with tblSplitter do begin
Active := True; Append;
{ 此处代码为插入数据 }
Active := False;
end;
// 启动线程
thrdSplitter := TSplitterThread.Create(strMobileNo, strJunoId, iAllColumn);
Sleep(2000);
...
end;执行线程操作部分代码如下:
procedure B;
// qrySplitter 为ADOQuery 控件,同样是对Splitter表进行操作
// 就是以下操作经常提示错误
with frmMain.qrySplitter do begin
SQL.Clear;
SQL.Add('SELECT DISTINCT * FROM [Splitter]');
SQL.Add('WHERE ([MobileNo]=''' + TMobileNo + ''')');
SQL.Add('AND ([JunoId]=''' + TJunoId + ''')');
SQL.Add('AND ([AllColumn]=' + IntToStr(TAllColumn) + ')');
SQL.Add('ORDER BY [NowColumn]');
Active := True;
end;
end;但是在procedure B中,错误信息为“Cannot perform this operation on a closed dataset”,如果去掉Sleep(2000)和将SQL语句的DISTINCT去掉,则不会出现这个错误,但是数据是乱的,就是拼合不正确,请问多线程的原理是什么?这段代码应该如何改?
解决方案 »
- 关于控件Tmaskedit的问题
- 用fastreport的frxPreview控件预览报表时,出现发生下列的错误:List index out of bounds (-1)Stack overflow
- 请高手指教 关于Eecel报表问题
- delphi多线程 建立 数据库连接的问题
- 如何进行网络udp数据包的发送和接收
- qrexpr的显示不了统计数据
- 怎樣在一個dbgrid中放置分屬於兩個表的字段呢?先謝謝.
- 请教FormatDateTime()函数的参数,怎样去定义日期格式?
- 一个难题目!
- 120急救!!delphi和ms sql sever的连接问题!!
- 我在制作安装程序时,碰到一个问题?请大家帮忙!
- 用StringGrid组件时,怎么设置第0列的宽度而保证其它列的宽度不会变?谢谢!!!
procedure B;
begin
// qrySplitter 为ADOQuery 控件,同样是对Splitter表进行操作
// 就是以下操作经常提示错误
if frmMain.qrySplitter then frmMain.qrySplitter:=false;
frmMain.qrySplitter.SQL.Clear;
frmMain.qrySplitter.SQL.Add('SELECT DISTINCT * FROM [Splitter]');
frmMain.qrySplitter.SQL.Add('WHERE ([MobileNo]=''' + TMobileNo + ''')');
frmMain.qrySplitter.SQL.Add('AND ([JunoId]=''' + TJunoId + ''')');
frmMain.qrySplitter.SQL.Add('AND ([AllColumn]=' + IntToStr(TAllColumn) + ')');
frmMain.qrySplitter.SQL.Add('ORDER BY [NowColumn]');
frmMain.qrySplitter.Active := True;
end;