D6中indy的问题?(50分)

  • 主题发起人 主题发起人 delphiB/S
  • 开始时间 开始时间
D

delphiB/S

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在客户端连接服务器时,先发送USR给服务器,然后到数据库里校验。
代码如下,但始终无法成功,检查半天,发现问题主要出在ADO上,
1、如果我将收到的字符串,写到一个TSTRINGS中,然后写到文件里,正常。
2、如果我把这个TSTRINGS放在ADO的CREATE前,写文件正常,后面写文件不成功。
3、ADO的所有连接,SQL语句都正常。
哪位能够替我看看。
另外,问一下,在EXECUTE中动态生成ADO,能够保证线程安全吗?
客户端
procedure TForm1.Button1Click(Sender: TObject);
begin
fidclient.Connect;
try
fidclient.WriteLn('usr');
memo1.Lines.Add(fidclient.ReadLn());
finally fidclient.Disconnect;end;
end;

服务器端
procedure TForm2.TESTIDSERVERExecute(AThread: TIdPeerThread);
var ado1:tadoquery;s:string;
begin
try ado1:=tadoquery.Create(self);ado1.Connection:=adoconn;
ado1.Close;ado1.SQL.Clear;
s:='select * from usrtable where usr='''+athread.Connection.ReadLn()+'''';
ado1.SQL.Add(s);ado1.Open;
if ado1.Eof then
athread.Connection.WriteLn('this is a test,but not pass')
else
athread.Connection.WriteLn('this is a test,pass');
finally athread.Connection.Disconnect;ado1.Free;end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
testidserver.Active:=true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
testidserver.Active:=false;
end;
 
可西我用的bcb5[:(]
 
高手呢?这又不是一个很冷门、很无聊的问题,难道大家在用INDY时都不用口令校验的吗?
 
tq,人气????????????
 
to delphiB/S
能介绍一下,你的程序用途及INDY是什么吗?(小弟见识小请赐教)
 
把tadoquery放到线程里面试一试,估计是SYNCHRONIZE的问题。
 
socket的相似代码也行。
socketconnection的PPC就不用了,我自己有。
 
在线程里用ADO组件的时候要加几个特别语句的,
一定记住在每个子线程都要使用
CoInitializeEx(nil, COINIT_MULTITHREADED);来初始化线程内的com对象。

记住先要uses ActiveX

在主线程中使用CoInitialize(nil)来初始化
 
to bigroom:
加了,不行,不过还是感谢。
各位大侠,能不能试试,我的原代码就在上面。
 
再加100分。
 
看看INDY主页上的FAQ:
Is it safe to access a database connection in a TIdTCPServer.OnExecute event?

Since the server triggers the OnExecute event in the context of a server connection thread,
you need to maintain an individual TSession for each thread.
However, you need to select a database driver which is thread-safe meaning it can be used
for concurrent access in several threads.

Some database drivers may NOT be thread safe so please ask the database engine
vendor about this before using it.
If you are using third-party BDE replacements, you need to consult your
documentation or ask the vendor if their product is thread-safe and follow
their instructions for using the component in multi-threaded servers.

 
另外,在它的网站里有个TCPDATASET的DEMO,你可以好好看看。
它用了一个第三方的数据组件,不过只有D4、5的。
 
后退
顶部