【问题标题】:Multiple ports listed in SQL Server connection stringSQL Server 连接字符串中列出的多个端口
【发布时间】:2010-05-14 14:18:54
【问题描述】:

我有一个旧版 VB6 应用程序,其中服务器名称、数据库名称、用户名等在 INI 文件中定义,但连接字符串的端口号(默认 1433)在应用程序中是硬编码的。它被移动到一个新的 sql server 后端,该后端运行不同的端口号。我试图避免更改和重新编译需要大量重新测试、文档等的应用程序。我尝试更改 INI 文件,以便为我放入的新服务器:SERVERNAME\INSTANCE,NEWPORTNUMBER

这有效地建立了与 Data Source = SERVERNAME\INSTANCE,NEWPORTNUMBER,1433 的连接;

当我运行应用程序时,这似乎可以正常工作,因为它连接到数据库。在我看来, ,1433 部分被忽略了。这是一个有效的假设还是会导致我在这里没有看到的一些问题?

编辑:在VB6代码中建立连接字符串的字符串方式是:

ConnectString = "Provider=MSDataShape;Trusted_Connection=Yes;Data Source=" & SERVER & ",1433;Initial Catalog=" & DATABASE & ";Data Provider=SQLOLEDB.1;Extended Properties=""Network=DBMSSOCN"""

使用从 INI 文件中提取的 SERVER 和 DATABASE 值。

【问题讨论】:

  • 最终采取了哪些措施来解决这个问题?您是否强制服务器使用端口 1433?批量替换和重新编译? SQL 别名?
  • 已经有一段时间了,但我记得,它似乎忽略了端口号并使用了 SERVERNAME\INSTANCE 并且工作得很好,所以我们就让它保持原样。

标签: sql-server vb6 connection-string


【解决方案1】:

端口 1433 通常会覆盖 INSTANCENAME。 (MS blog Referenceanother

我看到的三个选项:

  • 实例名称被忽略,您正在连接到端口 1433 上的默认实例
  • 命名实例侦听端口 1433
  • 您有一个客户别名(不相信这个)

【讨论】:

    【解决方案2】:

    我们能看到创建连接字符串的代码吗?

    是否有网络原因需要使用 TCP/IP 连接 sql server?

    我的猜测是你只需要包含一个 ;在服务器名称/实例名称之后,完全不使用端口号。这将导致端口号成为连接字符串中的无关数据。我认为这只是被忽略了。您可以通过创建 test.udl 文件并双击它来测试自己创建连接字符串 - 按照向导进行操作。完成后,连接字符串在 udl 文件中,您可以使用记事本查看。

    当然,如果您正在寻找连接字符串的语法,您可以在 connectionstrings.com 上查找它们

    【讨论】:

    • .1433 被硬编码到构建字符串的 VB6 代码中。如果不重新编译应用程序,就无法将其排除在外。
    • 我认为您错过了我的观点,但请参阅上面 wqw 的回答,这基本上是我的建议。并且由于指定了库,您可能需要传递端口号。但是你可以在没有它的情况下测试它并查看。
    【解决方案3】:
    1. 下载免费的 HEX 编辑器
    2. 在某处保存原始 exe 的副本 安全
    3. 在 HEX 编辑器中打开 exe
    4. 找到 1433 并将其更改为您的 新端口号

    一旦成功,您就不必重新测试所有内容(就像重新编译时一样)
    如果新端口号不是四位数字,那就更棘手了(阻力最小的路径:将其更改为四位数字端口)

    我过去曾以这种方式更改连接字符串。 VB6 exe 始终使用 DBCS,因此您可能不得不使用十六进制编辑器,直到您弄清楚如何以正确的方式使用搜索功能。

    如果端口号以整数形式存储,可能会更难找到,但仍有可能(寻找附近的字符串以获取线索)。

    【讨论】:

    • 不幸的是,这是一个主要的公司环境和分发给多个用户的应用程序,这不是一个选择。抱歉,我没有在描述中进一步澄清。
    【解决方案4】:

    显然这个应用程序很快就被黑掉了。尝试用一个简单的连接字符串注入来破解它,比如SERVER="{your_server},{your_port};FooBar="

    【讨论】:

      【解决方案5】:

      我不确定每个使用连接字符串的库是否一定会以相同的方式解析它。我认为可能有一个库可以解析该连接字符串并丢弃最后一个端口号,而另一个库可能会针对无效端口号引发错误。哪些库正在使用该连接字符串?

      如果您使用集成安全性,那么也许您可以在 INI 文件中设置数据源来表示,

      SERVERNAME,PORT; Password=
      

      并让 SQL 服务器忽略集成安全性未使用的密码密钥。也就是说,如果构造连接字符串的代码不检查类似的东西。哦,Will Rickards 好像也已经说过了。

      【讨论】:

      • VB6 中的标准 ADO 连接。
      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 2010-12-04
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多