2011-12-06 13 views
6

Este me tiene perplejo. Ni siquiera estoy tratando de conectarme a una base de datos. Cuando este código llega a la línea donde instancia un nuevo objeto SqlConnection, simplemente se cuelga allí, sin lanzar una excepción ni nada. Intenté compilarlo para 2.0. 3.5 y 4.0, y todos cuelgan. Por supuesto, también funciona en mi máquina y en la suya. Pero estoy tratando de ejecutar este código en un servidor Windows Server 2008 x64, y no se moverá.llamando al nuevo SqlConnection() bloquea el programa

// 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. 
    } 
} 

compilación (2.0): c: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ csc.exe example.cs

+0

Sí, se cuelga con o sin una cadena de conexión. – CrackingWise

+0

¿El comportamiento es el mismo si lo orienta a 32 o 64 bits? – Rob

+0

intenta pasar una cadena de conexión a la clase SqlConnection. – amrfaissal

Respuesta

1

proponemos 2 pasos:

  • restablecer IIS para borrar cualquier grupo de conexiones. (Tal vez reinicie Windows?)
  • cambio el código para tener una declaración using:
public static void Main(string[] args) { 
    Console.WriteLine("start"); 
    using (SqlConnection conn = new SqlConnection()) 
    { 
      Console.WriteLine("middle");    
    } 
    Console.WriteLine("finish");    
} 

¿Puede cualquier otra aplicación de esa máquina que cualquier otro objeto SqlConnection?

Obviamente es un problema ambiental, ya que su código publicado funcionará en cualquier otra máquina. Sospeche que se ha ido más allá de un punto de inflexión, y el using ayudará a defenderse de esto en el futuro.

+0

Interesante. ¿Por qué cree que ayuda "usar"? De todos modos, ¿qué hace exactamente el codificador sin parámetros? Alguien podría verificarlo con .NET Reflector. – kol

+0

Aún no reinicié la máquina, es un servidor de producción. Pero escribiendo i Como sugieres, nunca llega a "medio". – CrackingWise

+0

@CrackingWise: ¿qué tal restablecer IIS, era posible? –

2

Su instalación debe estar rota. El código realmente no hace nada vital, así que no hay razón para quedarse allí.

El constructor SqlConnection hace esto:

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

Así, se incrementa una variable, lo copia en una propiedad, llama al constructor de base, elimina el objeto de la cola finaliser, y copia una referencia. Eso es todo.

La base (DbConnection) constructor hace esto:

protected DbConnection() { 
} 

Por lo tanto, no hay nada aquí que realmente hace nada en absoluto relacionada con una conexión a base de datos real. Todo lo que se hace cuando realmente se abre una conexión.

Su programa podría estar colgando después de la primera llamada Console.WriteLine, y ni siquiera llegar a crear el objeto SqlConnection.

+0

Dudo que sea una instalación defectuosa, eso significaría que TODAS mis instalaciones .NET están rotas (2.0, 3.0, 3.5 y 4.0). Y no está colgando en la línea Console.Write, probé para eso. – CrackingWise

+0

¿No ocurre algo dentro del getter de la propiedad SingletonInstance? – kol

+0

Acepto, una instalación defectuosa es mi adivinanza # 1. Es bastante rápido y fácil de reinstalar .Net lo probaría primero. ¿Necesita .net2,3.5 y 4? Si no, instale solo el que necesita (reduzca los posibles problemas tanto como sea posible) – wal

0

Tuve el mismo problema y comenzó a funcionar después de que 1. Cambié el marco de destino de 4.0 a 3.5 y 2. cambié la configuración de depuración a x64 en Visual Studio.

6

Probablemente se trata de un contador de rendimiento roto, que es el problema. Tuve este problema y utilicé Procmon para detectar lo que sucedió. Mi aplicación .NET colgado cuando se trataba de cargar las claves de registro para el monitor de rendimiento "Proveedor de datos .NET para SqlServer"

descargué el contador con el siguiente comando para que funcione:

unlodctr ".NET Data Provider for SqlServer" 
+0

Gracias, ¡esto me ayudó cuando me encontré con este problema! – Konrad

+0

** ".NET Memory Cache 4.0" ** es otro que puede verse afectado, sin saber cómo se corrompen estos contadores. – SliverNinja

0

Solución encontrada! Tuve el mismo problema en muchas PC. 4.5.2 Marco

Ejecutar este comando como administrador en el CMD:

unlodctr ".NET Data Provider for SqlServer" 

Es posible que tenga que escribir a mano como copia de pasta no funciona bien con comillas.

Fuente:

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

Sé que este hilo es viejo, pero tal vez alguien más va a obtener este error. Es probablemente un contador de rendimiento roto, que es el problema. Tuve este problema y utilicé Procmon para detectar lo que sucedió. Mi aplicación .NET se colgó cuando llegó a cargar las claves de registro para el monitor de rendimiento ".NET Data Proveedor para SqlServer" Descargué el contador con el siguiente comando para ponerlo en funcionamiento: C: Windowsinf> unlodctr ".NET Data Proveedor para SqlServer "

+3

Esto es solo una repetición de una respuesta _derecha en esta página _... –

Cuestiones relacionadas