调用新的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
这可能是一个坏的性能计数器的问题。我有这个问题,我用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包之后,我遇到了完全相同的问题。对我来说,解决方案是:
- 在Visual Studio中点击"工具"->"选项"
- 搜索"Web Projects"(在Projects and Solutions下)
- 选中"为网站和项目使用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 "