调用新的SqlConnection()会挂起程序

本文关键字:挂起 程序 SqlConnection 调用 | 更新日期: 2023-09-27 18:16:53

这个问题难倒了我。我甚至没有尝试连接到数据库。当这段代码到达实例化新SqlConnection对象的行时,它只是挂起在那里,不抛出异常或任何东西。我已经尝试将其编译为2.0版本。3.5和4.0,他们都挂了。当然它在我和你的机器上都有效。但是我试着在Windows Server 2008 x64服务器上运行这段代码,它不会移动。

// example.cs
using System;
using System.Data;
using System.Data.SqlClient;
public class MainClass {
    public static void Main(string[] args) {
        Console.WriteLine("start");
        SqlConnection conn = new SqlConnection(); // hangs here
        Console.WriteLine("finish");              // never makes it here.
    }
}

编译(2.0):c:'Windows' Microsoft.NET ' Framework ' v2.0.50727 ' csc.exe example.cs

调用新的SqlConnection()会挂起程序

这可能是一个坏的性能计数器的问题。我有这个问题,我用Procmon来检测发生了什么。我的。net应用程序在加载性能监视器的注册表项时挂起了。. NET Data Provider for SqlServer"

我使用以下命令卸载计数器以使其工作:

unlodctr ".NET Data Provider for SqlServer"

您的安装必须被破坏。代码并没有真正做任何重要的事情,所以没有理由挂在那里。

SqlConnection构造函数这样做:

public SqlConnection() {
  this.ObjectID = Interlocked.Increment(ref SqlConnection._objectTypeCount);
  base();
  GC.SuppressFinalize(this);
  this._innerConnection = DbConnectionClosedNeverOpened.SingletonInstance;
}

因此,它增加一个变量,将其复制到属性中,调用基构造函数,从终结器队列中删除对象,并复制引用。就是这样。

基(DbConnection)构造函数这样做:

protected DbConnection() {
}

这里没有做任何与实际数据库连接相关的事情。所有这些都是在您真正打开连接时完成的。

在第一个Console.WriteLine调用之后,您的程序可能会挂起,甚至没有创建SqlConnection对象。

建议两步:

  • 重置IIS以清除所有连接池。(也许重启Windows?)
  • 将代码更改为using语句:
  public static void Main(string[] args) { 
    Console.WriteLine("start"); 
    using (SqlConnection conn = new SqlConnection())
    {
          Console.WriteLine("middle");              
    }
    Console.WriteLine("finish");             
} 

该机器上的任何其他应用程序都可以创建任何其他SqlConnection对象吗?

这显然是一个环境问题,因为您发布的代码将在任何其他机器上工作。我怀疑它已经超过了某个临界点,using将在未来帮助防御它。

我有同样的问题,它开始工作后,我1。将目标框架从4.0更改为3.5,以及2。将visual studio中的调试设置更改为x64

在升级了一些nuget包之后,我遇到了完全相同的问题。对我来说,解决方案是:

  1. 在Visual Studio中点击"工具"->"选项"
  2. 搜索"Web Projects"(在Projects and Solutions下)
  3. 选中"为网站和项目使用64位版本的IIS Express"

我试图通过执行以下命令来卸载性能计数器。

unlodctr ".NET Data Provider for SqlServer"

然而,我得到一个消息,性能计数器没有安装。因此,我执行以下命令重新安装性能计数器。

lodctr "C:'Windows'INF'.NET Data Provider for SqlServer'_dataperfcounters_shared12_neutral.ini"

解决方案找到!我在许多 pc上有同样的问题。框架4.5.2

在CMD中以admin身份运行该命令:

unlodctr ".NET Data Provider for SqlServer"

你可能需要手工输入,因为copy pasta不能很好地使用引号。

源:

http://askproblem.com/question/calling-new-sqlconnection-hangs-program/

我知道这个线程是旧的,但也许其他人会得到这个错误。这是可能是性能计数器坏了,这才是问题所在。我遇到了这个问题我用Procmon来检测发生了什么。我的。net应用程序在加载性能监视器的注册表项时挂起了。净数据我用下面的命令卸载了计数器让它工作:C: Windowsinf>unlodctr"。. NET Data Provider for SqlServer "