我刚刚决定在重新启动MSSQL数据库服务器时解决“连接”问题,并且连接永久删除。
到目前为止,唯一的解决方案是重新启动程序,并不总是在远处的服务器上这么容易(并且必须首先检测到问题)。
**下面的代码似乎工作正常,但熟练的ADO人员可以更深入地查看代码并查看此代码所需的任何错误/问题或改进吗? **
Type
TComponentHelper = class helper for TComponent
Procedure Reconnect(var AdoConn:TAdoConnection; ConnStr:String);
end;
procedure TComponentHelper.Reconnect(var AdoConn: TAdoConnection; ConnStr: String);
begin
if Assigned(AdoConn) then begin
FreeAndNil(AdoConn);
AdoConn := TAdoConnection.Create(Self);
AdoConn.ConnectionString := ConnStr;
AdoConn.LoginPrompt := false;
SetConnAdoComponent(Self,AdoConn);
AdoConn.Open;
end;
end;
procedure SetConnAdoComponent(aSrc:TComponent; var AdoConn:TAdoConnection);
var
Ctrl : TComponent;
i : Integer;
begin
if (aSrc = Nil) then Exit;
if (aSrc.ComponentCount <= 0) then Exit;
for i:=0 to aSrc.ComponentCount-1 do begin
Ctrl := aSrc.Components[i];
if (Ctrl is TAdoQuery) then TAdoQuery(Ctrl).Connection := AdoConn;
if (Ctrl is TAdoTable) then TAdoTable(Ctrl).Connection := AdoConn;
if (Ctrl is TAdoDataset) then TAdoDataset(Ctrl).Connection := AdoConn;
end;
end
我从TForm或TDataModule中的Exception部分调用Reconnect(),AdoConn是TAdoConnection组件的名称,ConnStr是使用的完整连接字符串。
Except
On E:EOleException do begin
ReConnect(AdoConn,ConnStr);
end;
On E:Exception do begin
ReConnect(AdoConn,ConnStr);
end;
End;
答案 0 :(得分:2)
不要破坏TADOConnection
您最好的选择,而是用新的替换内部TADOConnection.ConnectionObject
。 e.g。
uses ActiveX, ComObj, ADOInt;
function CreateADOConnectionObject: _Connection;
begin
OleCheck(CoCreateInstance(CLASS_Connection, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;
var
NewConnectionObject: _Connection;
ConnectionString: WideString;
begin
ConnectionString := ADOConnection1.ConnectionString;
NewConnectionObject := CreateADOConnectionObject;
NewConnectionObject.ConnectionString := ConnectionString;
ADOConnection1.Close;
// set the new connection object
ADOConnection1.ConnectionObject := NewConnectionObject;
ADOConnection1.Open;
end;
设置ADOConnection1.ConnectionObject := NewConnectionObject
将销毁先前的内部FConnectionObject
并设置一个新的连接对象以供TADOConnection
对象使用。
此外,您还需要在异常时处理特定 EOleException.ErrorCode
(可能是E_FAIL
),以确保您不会处理其他异常与你的问题无关。
我没有尝试使用您的特定方案(SQL重启)。我把它交给你进行测试。
编辑:使用SQL Server 2014和SQLOLEDB.1
进行测试。我的应用程序连接到SQL,重新启动SQL后,我无法重现所描述的行为&#34;连接被永久删除&#34; 。 Close
/ Open
完成了工作,客户重新连接。