【问题标题】:Upgraded .net webapp can't open connection to database升级的 .net webapp 无法打开与数据库的连接
【发布时间】:2009-08-06 04:13:34
【问题描述】:

我有一个旧的 .net 1.0 webapp,需要对其进行一些维护。我已经使用自动升级器将其升级到 .net 3.5(后来也尝试了 2.0),但现在它无法连接到数据库。

从表面上看,这看起来像是一个新手连接字符串问题,但我认为它更有可能与升级中的一些微妙问题有关。


我收到一般错误消息:

建立与服务器的连接时出错。连接到 SQL Server 2005 时,此故障可能是由于在默认设置下 SQL Server 不允许远程连接造成的。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)


源代码非常基础,没有花里胡哨:

protected static SqlConnection objConn;

objConn = new SqlConnection(strConnectionString);

try
{
    objConn.Open();
}

也试过了:

using (objConn = new SqlConnection(strConnectionString))
{
    objConn.Open();
    ...
}

连接字符串来自web.config,并且使用调试器设置断点并在尝试打开连接之前查看连接的属性,我可以看到它正确找到了连接字符串:

connectionString="数据源=XXX.XXX.XXX.XXX;初始目录=XXXXXX;用户ID=XXXXXX;密码=XXXXXX"


我认为我已经排除了一些事情:

无论连接到Sql Server 2005 还是Sql Server 2000,错误信息都是一样的。

VS 错误列表中没有错误或警告。

连接字符串与其他几个也使用相同数据库的网站相同,所以我知道连接字符串是正确的。

我已经尝试让它从我的本地计算机(我可以通过 Sql Query Analyzer 连接到数据库)和普通网络服务器连接,所以这不是防火墙问题,也不是最大连接数问题。

它正在连接到服务器的 IP 地址,因此不是计算机浏览器问题(其他 web 应用程序可以正常连接。

TCP 和命名管道是 sql server 上启用的两种网络协议。

添加“网络库=DBMSSOCN;”到连接字符串更改错误消息以包含“提供者:TCP Provider,错误”(前几天我在连接字符串中更改的其他内容也有影响,但我现在不记得了。)


我已经浏览过其他 3 篇关于堆栈溢出的类似帖子:
(无法在此处列出链接,因为我是新用户,但如果其他人想在评论中链接到他们,他们的问题 ID 是:63875、1038888、846479)
另一个网站上的这篇文章有一些很好的想法可以尝试,但也没有帮助:
http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx


我最好的猜测是,它是由 .net 版本之间的升级引起的 - 可能是 web.config 中的问题?

这是一个 C# 应用程序,非常小/基本,但已分为三个项目。

【问题讨论】:

  • 更新到 3.5 时,我想确认一下:您使用的是 3.5sp1 还是基础 3.5?
  • 另外,您是否能够使用来自同一服务器的相同连接字符串连接到数据库?
  • 您说您可以通过 SQL Server Management Studio(或查询分析器)进行连接,您是否也在遇到问题的机器上对其进行了测试(从您的文字中不完全清楚)?
  • 啊哈!看起来我没有 3.5sp1,这只是我希望被提醒的类型。 “使用来自同一服务器的相同连接字符串连接到数据库?” -- 是的,我将这个 web 应用与(同一服务器)另一个成功连接到同一数据库的 web 应用一起上传。
  • 安装 SP1 需要 2 小时,但没有区别。

标签: .net sql-server .net-3.5 upgrade .net-1.0


【解决方案1】:

由于从来没有为这个问题提供过实际的解决方案,所以这里有一个对我有帮助的解决方案:

当我将一个完美运行的 ASP.NET 2.0 应用程序升级到 .NET 3.5 时,我遇到了完全相同的问题。 Web 应用程序由 Windows XP 上的 IIS 5.1 托管,我使用的是 SQL Server Express 2005。我在 web.config 中使用以下连接字符串:

<add name="myDbConnection" providerName="System.Data.SqlClient" connectionString="Data Source=http://localhost;Server=.\SQLEXPRESS;Initial Catalog=MyDatabaseName;Integrated Security=True"/>

如您所见,我在这里没有进行 tcp 连接或连接到远程服务器。我只是通过命名管道连接本地主机上的 SQLEXPRESS 实例。这就是为什么我认为,它与允许 SQL Server 2005 上的远程连接完全无关。但正如我发现的那样,它确实如此! (我不知道实际原因!)我花了几个小时才找到答案,所以也许这对某人有帮助......

你必须做什么(请使用谷歌了解详情):

  1. 允许通过 SQL Server 2005 外围应用配置工具进行本地和远程连接 (我选择“同时使用 TCP/IP 和命名管道”选项)
  2. 启用 SQL Server Browser 服务
  3. 通过 SQL Server 配置管理器工具将所有 IP 的侦听 TCP 端口设置为 1433
  4. 享受您正在运行的网络应用程序 :-)

当 .NET 3.5 Web 应用程序已经在 .NET 2.0 上运行时,为什么要成功连接到 SQL Server,为什么所有这些都是必要的!

【讨论】:

    【解决方案2】:

    编写一个控制台应用程序,它只尝试使用您发布的代码连接到数据库。在控制台程序中硬编码连接字符串。

    换句话说,消除所有干扰,以确保您尝试运行的核心代码确实正常运行。

    【讨论】:

    • 最后的手段 :-) 如果/当所有其他方法都失败了,至少我还有一些东西可以尝试......除非这仍然失败!
    • 我现在已经试过了,控制台应用也无法连接。是时候让它成为系统管理员的问题了!感谢您的建议。
    【解决方案3】:

    根据this,SQL 2005 未配置为允许传入本地或远程连接,您必须自己启用它。

    【讨论】:

    • 我认为这不是问题所在。他说相同的字符串也适用于其他应用程序(“连接字符串与其他几个也使用相同数据库的网站相同,所以我知道连接字符串是正确的。”)。但最好向其他可能在连接 SQL 2005 数据库时遇到问题的用户指出这一点。
    • 是的,这是其他人应该检查的第一件事,但那已经完成了。我也无法连接到 SQL 2000 数据库。
    【解决方案4】:

    我确定您已经完成了这些步骤,但是...尝试为 SQL Server 启用远程连接并启用 SQL Server Browser 服务。可以在here 找到两者的演练。

    【讨论】:

      【解决方案5】:

      您可以尝试使用其他类型的连接字符串。我的连接字符串通常格式如下:

      <add name="DataFrom" connectionString="SERVER=[servername];Database=[dbname];UID=[userid];PWD=[password];"/>
      

      您所说的其他应用程序是否也适用于 .NET 3.5 应用程序?



      我也很好奇你是如何让这段代码工作的

      using (var = new SqlConnection(strConnectionString))
      {
          objConn.Open();
          ...
      }
      

      我想你是说

      using (objConn = new SqlConnection(strConnectionString)) 
      

      对吗?

      【讨论】:

      • 谢谢,我已经修复了上面代码示例中的错误(正在整理一下以便发布,应该保持原样。)我会尝试更改连接字符串您建议的关键字。
      猜你喜欢
      • 2018-04-15
      • 2017-01-10
      • 2022-12-02
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多