在TcpServer的onAccept事件中生成数据库连接出了问题????(50分)

  • 主题发起人 主题发起人 pickup
  • 开始时间 开始时间
P

pickup

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TcpServer做了一个服务程序,接受用户的查询命令然后查询数据库
将数据反馈给用户.现在就是在生存数据库连接时候报错:标记没有引用存储
代码如下:

procedure TMainForm.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
nSize,i:integer;
conn :TADOConnection;
buffer:Array of char;
s,rtnStr:String;
begin
nSize:=ClientSocket.ReceiveBuf(buffer,BufferSize);
for i:=1 to nSize do
begin
s:=s+buffer;
end;
try
conn:=TADOConnection.Create(self);///!!!!!!!有错
//
读数据库数据
//
rtnStr:='数据库数据';
except
on e:Exception do
rtnStr:=e.Message;
end;

//发送反馈字符
for i:=1 to BufferSize do
buffer:=chr(0);
for i:=1 to length(rtnStr) do
buffer:=rtnStr;
ClientSocket.SendBuf(buffer,length(rtnStr));
end;


是不是线程堆栈空间不够啊?
每个onAccept都是一个独立的线程里面运行吧?
有那位大侠知道的望不吝赐教!!!
 
在线程里用COM组件(包括ADO)都需要进入时调用CoInitialize(nil),退出时用CoUnInitialize。
 
建议你不要建立新的cnn,共用一个连接就行了
 
我在程序里面是做了线程互斥的,可以保证不会冲突,不在线程里面生成连接也是可以的,
我现在已经把问题规避掉了,只是我想知道原因。
 
不是线程冲突问题,而是COM函数库的初始化是为每个线程服务的,所以要在线程里使用COM,
就必须在这个线程中使用CoInitialize

在主程序中不会出现这个问题,是因为你引用了相关的unit时,在unit的初始化段里已经帮
你做了这件事,因为在主线程中不需要CoInitialize
 
后退
顶部