在我的Datasnap客户端应用程序中,我为我的方法和ProviderConnection使用了1个TSQLConnection。 连接丢失时出现问题。 TSQLConnection.Connected和TSQLConnection.ConnectionState都无法捕捉到这一点。Mannaging SQLConnection/Datasnap通过客户端 - 服务器断开连接
当我的TSQLconnection打开但我失去了互联网连接,或服务器停止。Datasnap客户端应用程序出现很多错误。 (服务器方法或ClientDatasets)
我创建了一个函数来管理我的服务器方法的SQL连接。但是当例如关闭通过TDSProviderConnection连接的ClientDataset时会出现更多问题。
问:如何管理客户端应用程序以安全捕获TSQLconnection上的任何断开连接。 问题:您如何管理停机时间,以及您如何处理未保存的客户端状态。
停机后重新连接不是问题。
当调用servermethod时:这会抛出异常。
tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true);
因此,我写下一个方法来从我的datamodule用虚拟方法获取TSQLCONNECTION。
function TDMForm.DSConnection: TSQLConnection;
var
tmpM:TServerMethodsClient;
begin
result:=nil;
if assigned(MYTSQLCONNECTION) then begin
tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true);
try
try
tmpM.Ping;
result:=MYTSQLCONNECTION
except
ReconnectForm.ShowModal; // has a reconnect button that tries to reconnect + shutdownbutton
if ReconnectForm.modalresult=mrOK then
result:=MYTSQLCONNECTION
else
MainForm.Close;
end;
finally
tmpm.Free;
end;
end;
end;
我写的方法这种方式,因为只有找出如果连接丢失的方法是通过虚拟方法至极将抛出同样的错误......然后我可以查询重新连接或关闭程序。
编辑:(我期待某种一般的回答和指导方针,做了并且不不是我的代码修正,这只是展示一下我在此刻做的。)
你说“用户可以重新登录”,但你没有说你是怎么做到的?在我自己的Datasnap应用程序中,即使是对TSQLConnection1.Connected:= False的调用,也会引发异常(10053),因为它试图告诉服务器(现在不存在)。我在这里捕捉22。你是怎么绕过_that_的? – nolaspeaker
@nolaspeaker - 因为我知道我要重新进行身份验证,所以我并不在意这个例外。所以我只使用'try sqlcon.Close;除了结尾;',它吃任何例外。然后,我可以静静地重新进行身份验证,或者再次向用户显示登录对话框,以便他们手动登录。 –
是的,该处理也发生在我身上 - 在我问你问题之后! :-)感谢您的回应。 – nolaspeaker