вызов новой программы SqlConnection () зависает - PullRequest
6 голосов
/ 07 декабря 2011

Это меня поставило в тупик. Я даже не пытаюсь подключиться к базе данных. Когда этот код попадает в строку, где я создаю экземпляр нового объекта 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

Ответы [ 6 ]

6 голосов
/ 12 февраля 2015

Вероятно, проблема в неправильном счетчике производительности. У меня была эта проблема, и я использовал Procmon, чтобы обнаружить, что произошло. Мое приложение .NET зависло при загрузке разделов реестра для монитора производительности «Поставщик данных .NET для SqlServer»

Я выгрузил счетчик с помощью следующей команды, чтобы он заработал:

unlodctr ".NET Data Provider for SqlServer"
2 голосов
/ 07 декабря 2011

Ваша установка должна быть нарушена.Код на самом деле не делает ничего жизненно важного, поэтому нет причин зависать там.

Конструктор SqlConnection делает это:

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

Итак, он увеличивает переменнуюкопирует его в свойство, вызывает базовый конструктор, удаляет объект из очереди финализатора и копирует ссылку.Вот и все.

Базовый (DbConnection) конструктор делает это:

protected DbConnection() {
}

Итак, здесь нет ничего, что могло бы вообще что-либо делать с фактическим соединением с базой данных.Все, что делается, когда вы фактически открываете соединение.

Ваша программа может также зависать после первого вызова Console.WriteLine, и даже не доходить до создания SqlConnection объекта.

1 голос
/ 07 декабря 2011

Предложите 2 шага:

  • сброс 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 поможет защититься от этого в будущем.

0 голосов
/ 01 июля 2019

У меня возникла та же проблема после обновления ряда пакетов nuget.Для меня решение было:

  1. В Visual Studio перейдите в «Инструменты» -> «Параметры»
  2. Поиск «Веб-проекты» (в разделе «Проекты и решения»)
  3. Установите флажок «Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов»
0 голосов
/ 02 июля 2015

Решение найдено! У меня была такая же проблема на многих ПК. Рамки 4.5.2

Запустите эту команду от имени администратора в CMD:

unlodctr ".NET Data Provider for SqlServer"

Возможно, вам придется ввести его вручную, поскольку копировальная паста плохо работает с кавычками.

Источник:

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

Я знаю, что эта ветка старая, но, возможно, кто-то другой получит эту ошибку. Это вероятно, сбой счетчика производительности, который является проблемой. У меня была эта проблема и я использовал Procmon, чтобы обнаружить, что случилось. Мое приложение .NET зависло, когда> пришло время загрузки разделов реестра для монитора производительности “.NET Data Провайдер для SqlServer »Я выгрузил счетчик следующей командой заставить его работать: C: Windowsinf> unlodctr «Поставщик данных .NET для SqlServer»

0 голосов
/ 18 июля 2012

У меня была такая же проблема, и она начала работать после того, как я 1. Изменил целевой фреймворк с 4.0 на 3.5 и 2. изменил настройки отладки на x64 в visual studio.

...