Microsoft AlwaysOn 故障转移解决方案和 Delphi

2024-02-29

我正在尝试制作一个 Delphi 应用程序来与 AlwaysOn 解决方案一起使用。我在谷歌上发现我必须使用MultiSubnetFailover=True在连接字符串中。

应用程序在Delphi XE3中编译并使用TADOConnection.

如果我使用Provider=SQLOLEDB在连接字符串中,应用程序启动,但看起来像MultiSubnetFailover=True没有影响。

如果我使用Provider=SQLNCLI11(我在 Google 上发现 OLEDB 不支持 AlwaysOn 解决方案,我必须使用 SQL Native 客户端)尝试打开连接时得到无效属性。

连接字符串是:

Provider=SQLOLEDB.1;Password="password here";Persist Security Info=True;User ID=sa;Initial Catalog="DB here";Data Source="SQL Instance here";MultiSubnetFailover=True

我是否必须升级到 Delphi 上的较新版本才能使用此故障转移解决方案,或者连接字符串中是否缺少某些内容?


我目前正在使用 XE2 和 SQL Server AlwaysOn。如果您阅读文档,您将看到 AlwaysOn 弹性事件将导致您的数据库连接失败,您需要启动一个新的连接。

如果 SqlClient 应用程序连接到 AlwaysOn 数据库 故障转移,原始连接断开,应用程序必须 故障转移后打开新连接以继续工作。

我通过使用我自己的版本覆盖 TAdoQuery 组件的简单权宜之计来处理这个问题,该版本在连接失败后重试连接。这可能不是正确的方法,但它确实有效。它的作用是覆盖为打开而调用的方法(如果查询返回结果集)或执行 SQL(否则),如果由于连接丢失错误而失败,则再次尝试(但仅一次)。我已经针对 AlwaysOn 切换进行了大量测试,它对于我们的配置可靠地工作。它还会对任何其他连接丢失事件做出反应,从而处理查询失败的一些其他原因。如果您使用 TAdoQuery 以外的组件,则需要为该组件创建类似的覆盖。

可能可以通过其他方式来解决这个问题,但一旦我找到了可行的方法,我就不再寻找替代方案。您可能需要整理 use 语句,因为它显然包含一些不需要的内容。 (光看这段代码就让我想离开并重构代码重复)

unit sptADOQuery;

interface

uses
  Windows, Messages, SysUtils, Classes, Db, ADODB;

type
  TsptADOQuery = class(TADOQuery)
  protected
    procedure SetActive(Value: Boolean); override;
  public
    function ExecSQL: Integer;   // static override
  published
  end;

procedure Register;

implementation

uses ComObj;

procedure Register;
begin
  RegisterComponents('dbGo', [TsptADOQuery]);
end;

procedure TsptADOQuery.SetActive(Value: Boolean);
begin
  try
    inherited SetActive(Value);
  except
    on e: EOleException do
    begin
      if (EOleException(e).ErrorCode = HRESULT($80004005)) then
      begin
        if Assigned(Connection) then
        begin
          Connection.Close;
          Connection.Open;
        end;
        inherited SetActive(Value);   // try again
      end
      else raise;
    end
    else raise;
  end;
end;

function TsptADOQuery.ExecSQL: Integer;
begin
  try
    Result := inherited ExecSQL;
  except
    on e: EOleException do
    begin
      if (EOleException(e).ErrorCode = HRESULT($80004005)) then
      begin
        if Assigned(Connection) then
        begin
          Connection.Close;
          Connection.Open;
        end;
        Result := inherited ExecSQL;   // try again
      end
      else raise;
    end
    else raise;
  end;
end;

end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft AlwaysOn 故障转移解决方案和 Delphi 的相关文章

  • 在 Outlook 中创建带有附件的邮件并显示它

    我想在 Outlook 中创建一封带有附件的邮件并在发送之前显示它 但我想我已经尝试了几乎在网上找到的所有示例 但没有任何运气 我可以使用 Indy 但我非常想使用 Outlook 来确保邮件正确 因为它是用于商业用途 函数的任何输入 该函
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • Delphi - 相当于C#的三元运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi 中是否存在或者将来是否存在条件运算符 https stackoverflow com questions 2108609 is there or is there ever going
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • Delphi XE5 REST/Android 客户端“会话已过期”

    我有一个REST Server与Android Client 都在Deplhi Xe5 Android客户端成功连接Rest服务器 在我的服务器中我有一个TDSHttpWebDispatcher with SessionTimeout 12
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 如何在拥有句柄时检查给定进程是否正在运行

    我在用ShellExecuteEx启动应用程序 成功开始阅读后TShellExecuteInfo hProcess获取已启动进程的句柄 我想定期检查我的应用程序启动的进程是否仍在运行 两个或多个同名进程可以同时运行 我想确保我的应用程序正在
  • 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

    我正在编写一个 Windows 32 位程序 可以使用多个可能的 dll 之一 所以它尝试依次加载每个 dll 使用SysUtils SafeLoadLibrary如果加载成功 它就会使用该 dll 不幸的是 其中一些 dll 静态链接到其

随机推荐

  • graph - 如果我用哈希表替换邻接列表中的每个链表,有什么缺点?

    CLRS excise 22 1 8 我是自学 没有在任何大学学习 假设每个数组条目 Adj u 不是链表 而是一个 包含顶点 v 的哈希表 其中 u v E 如果所有 边缘查找的可能性相同 预计的时间是多少 判断图中是否有边 有什么缺点
  • 在 SELECT 中创建数组

    我正在使用 PostgreSQL 9 1 并且有以下数据结构 A B 1 a 1 a 1 b 1 c 1 c 1 c 1 d 2 e 2 e 我需要一个产生此结果的查询 1 4 c 3 a 2 b 1 d 1 2 1 e 2 A 1 总共
  • 通过 gspread 和 Google Sheets API 更改 Google Sheets 中的列格式

    我正在使用 gspread 并且正在寻找一种通过脚本更改列格式的正确方法 我有一个包含持续时间的专栏 我想将整个列的格式更改为duration 在 Google UI 中 我可以标记整个列 然后单击格式 然后单击编号并设置duration
  • Eclipse:导出运行配置

    我用 eclipse 编写了一个复杂的 Java 应用程序 它使用了项目文件夹中包含的许多 jar 库 有没有一种快速的方法来导出应用程序的运行配置 允许我从 shell 运行它 我实际上不需要在机器上移动它 所以没有 jar 导出或类似的
  • 将测试双打与 DbEntityEntry 和 DbPropertyEntry 结合使用

    我正在按照概述使用 EF6 中的新测试替身这里来自 MSDN http msdn microsoft com en us data dn314431 aspx contextInterface 带有起订量和 nUnit 的 VS2013 一
  • 如何使用 pycurl 读取标题

    如何读取 PyCurl 请求返回的响应标头 有多种解决方案 默认情况下 它们被删除 这是一个 使用选项 HEADERFUNCTION 的示例 它可以让您指示 函数来处理它们 其他解决方案是选项 WRITEHEADER 与 WRITEFUNC
  • 在 x86 平台中使用 -mcmodel=kernel 标志

    我正在尝试将为 x86 架构构建的设备驱动程序交叉编译到 ARM 平台 它的编译没有任何错误 但我认为所有功能都不可用 所以我检查了 makefile 并找到了这个特定的部分 ifeq ARCH x86 64 EXTRA CFLAGS mc
  • Firebase 和后端逻辑

    我是 parse com 用户 现在我正在寻找其他服务 如何将后端逻辑写入 firebase 假设我想验证服务器端的所有值 或者触发一些事情 我想到了一种解决方案 但我想知道推荐的方法 我想 创建使用express的nodejs服务器 创建
  • 使用 classpathentry 包含多个 jar

    我有一个 eclipse 的 classpath 文件 如下所示
  • Laravel 3 - 如何验证复选框数组,至少选中 1 个?

    我开始学习 Laravel 并且仍在学习曲线上 现在我从 Laravel 3 开始 但一旦我开始工作 很可能会将我的项目切换到 Laravel 4 现在的问题是 如何验证复选框数组 我想验证组内至少有 1 个复选框已启用 选中 我在 Lar
  • Bulma 导航栏和 VueJS 路由器活动链接

    我已经开始使用布尔玛0 7 1 and VueJs 2 5 17 现在 我正在使用 Vue 路由器组件 并且我希望每当我位于链接表示的 页面 上时 将导航栏中的按钮设置为活动状态 我的代码如下
  • 由于冲突,无法删除一些未标记的 docker 镜像

    我无法显式删除一些未标记的 docker 映像 具体来说 那些带有标签的
  • C#/.NET:在 C# 中创建动态视觉效果

    注意 我不太确定如何标题或标记这个问题 所以如果您有任何想法 请帮忙 我目前正在设想一些可能的项目 涉及动态渲染某些东西 作为假设的例子 无论是点 线 文本还是五线谱上的音符 但是 如果我要承担这些项目 我 我不太确定如何实现这个设计 我很
  • 在 C# 中验证 FQDN

    有人有正则表达式来验证合法的 FQDN 吗 现在 我使用这个正则表达式 1 254 d a zA Z0 9 1 63 a zA Z 2 但是 此正则表达式会导致 aa a 无效 而 aa aa 有效 有谁知道为什么 这是一个较短的模式 1
  • 如何查询所有子文档

    我从 MongoDb 和 nodejs 使用 mongoose 开始 我有一个收藏Stories 每个都可以有一个或多个Tags 是这样的 title The red fox content The red fox jumps away t
  • 使用 bootstrap 的 Angular 6 库

    我正在使用 Angular 6 库功能在 Angular 项目中创建 Angular 库https github com angular angular cli wiki stories create library https githu
  • 如何在图片下方写标题?

    我有两个图像需要保持内联 我想在每张图片下写一个标题
  • Ionic 3 - 每个页面都需要自己的模块吗?

    我是 Ionic 新手 试图了解如何组织中型应用程序 每个页面应该有自己的模块吗 或者将相似的页面分组到同一个模块中是否更好 有可能这样做吗 看来 IonicPageModule forChild 方法只接受一页 IonicPageModu
  • 将环境类与管道运行结合使用

    我正在使用环境类对管道使用估计器步骤 以便拥有自定义 Docker 映像 因为我需要一些apt get软件包能够安装特定的 pip 软件包 从日志中可以看出 与估计器的非管道版本不同 它完全忽略了环境变量的 docker 部分 很简单 这似
  • Microsoft AlwaysOn 故障转移解决方案和 Delphi

    我正在尝试制作一个 Delphi 应用程序来与 AlwaysOn 解决方案一起使用 我在谷歌上发现我必须使用MultiSubnetFailover True在连接字符串中 应用程序在Delphi XE3中编译并使用TADOConnectio