- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚决定解决 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;
最佳答案
与其破坏 TADOConnection
,最好的选择是用新的替换内部 TADOConnection.ConnectionObject
。例如
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 后,我无法重现所描述的行为“连接永远断开”。 Close
/Open
完成了工作,客户端重新连接。
关于Delphi AdoConnection 重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41280679/
我刚刚决定解决 MSSQL 数据库服务器重新启动时的“连接”问题,并且连接永远断开。 到目前为止,唯一的解决方案是重新启动程序,但在距离很远的服务器上并不总是那么容易(并且必须首先检测到问题)。 **
我有以下代码引发 EConvertError -“无法将 TAdoConnection 分配给 TAdoConnection” var wTmpADOConn : TADOConnec
这个问题已经有答案了: ADO Connection Timeout problem (2 个回答) 已关闭 6 年前。 我有一个控制服务器连接的功能。如果 ado 在 5 秒内无法连接,则应该给出错
我正在使用TIdHTTPServer创建一个简单的Indy网络服务器。几乎所有请求服务器都需要与数据库通信(通过TAdoConnection)。看到数据库连接在资源方面有点昂贵,我想创建一个池机制来重
我正在尝试打开一个 ADOConnection 组件。数据库为 MDB 格式。我使用 JET 访问它。 每当我在代码中使用 AdoConnection.Open 时,都会弹出窗口并询问用户 ID 和密
Delphi XE3,Win7教授 我需要写入 DBASE 3(旧格式)文件,以便为类似 DOS 的应用程序(Clipper?)导出数据。好吧,我想:MS DBASE 驱动程序可以做到这一点。 但我对
我需要通过 TADOConnection 连接到 Excel 表,但我不知道要在 ConnectionString 属性中写入什么内容。对于 Excel 版本 8,我使用 Jet,对于 12,我使用
如果我执行类似的查询 Update Table Set aField = 1 Where tablePk = 1 我可以从AdoConneciton的ExecuteComplete事件中获取受影响的记
我的一些 MS SQL 存储过程使用“print”命令生成消息。在我的 Delphi 2007 应用程序中,它使用 TADOConnection 连接到 MS SQL,如何查看这些“打印”命令的输出?
我在 Delphi 7 应用程序的特定情况下遇到了问题。 我有 ADOConnection,它使用一些用户名连接到我的 MS SQL 服务器并通过 - SQL 身份验证。问题是 MS SQL 登录是使
我是一名优秀的程序员,十分优秀!