Pregunta

Tengo un viejo .NET 1.0 webapp que necesita un poco de mantenimiento realizado sobre él. He utilizado el auto-actualizador para actualizarlo a .NET 3.5 (y también más adelante intentado 2.0), pero ahora no se puede conectar a la base de datos.

En la superficie esto parece un problema novato de cadena de conexión, pero estoy pensando que es más probable que esté relacionado a algún problema sutil de la actualización.


consigo el mensaje de error genérico:

Se produjo un error al establecer una conexión con el servidor. Cuando se conecta a SQL Server 2005, este error puede ser causado por el hecho de que la configuración predeterminada de SQL Server no permite conexiones remotas. (Proveedor: proveedor de canalizaciones, error: 40 - No se pudo abrir una conexión a SQL Server)

Francia El código fuente es bastante básico, sin campanas y silbatos:

protected static SqlConnection objConn;

objConn = new SqlConnection(strConnectionString);

try
{
    objConn.Open();
}

y también trató como:

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

La secuencia de la conexión viene del web.config, y utilizando el depurador para establecer un punto de descanso y mirar a través de las propiedades de la conexión antes de intentar abrirlo, puedo ver que su conocer la cadena de conexión correctamente:

connectionString = "Data Source = XXX.XXX.XXX.XXX; Initial Catalog = XXXXXX; User ID = XXXXXX; contraseña = XXXXXX"


Un puñado de cosas creo que he descartado:

El mensaje de error es el mismo si se conecta a SQL Server 2005 o SQL Server 2000.

No hay errores o advertencias en la Lista de errores VS.

La secuencia de la conexión es lo mismo que un par de otros sitios web que también utilizan la misma base de datos, así que sé que la cadena de conexión es correcta.

He tratado de tener que conectarse desde el ordenador local (donde pueda conectarse a las bases de datos a través de SQL Query Analyzer) y desde el servidor web normal, así que no es un problema de cortafuegos, tampoco es un tema max-connections.

Se conecta a la dirección IP del servidor, por lo que no es un problema del navegador del ordenador (y otras aplicaciones web pueden conectar muy bien.

TCP y canalizaciones con nombre son los 2 protocolos de red habilitados en el servidor SQL.

La adición de "Red de Bibliotecas = DBMSSOCN;" a la cadena de conexión cambia el mensaje de error para incluir "Proveedor: Proveedor de TCP, error" (que había algo más que cambié en la cadena de conexión el otro día que también tenían que afectan, pero no puedo recordar lo que ahora).


Ya he mirado a través de otras 3 publicaciones similares sobre desbordamiento de pila:
(No se puede listar enlaces aquí porque soy un nuevo usuario, pero la pregunta de identificación de si otra persona quiere vincular a ellos en un comentario son: 63875, 1038888, 846479)
Y este artículo en otro sitio tenía algunas buenas ideas de cosas para probar que no ayuda tampoco:
http://weblogs.sqlteam.com/tarad/archive/ 2008/05/23 / 60609.aspx


Mi mejor conjetura es que es algo causado por la actualización entre versiones .net - tal vez algo mal en el web.config

?

Es una aplicación C #, bastante pequeña / básico, pero se ha dividido en tres proyectos.

¿Fue útil?

Solución

Escribir una aplicación de consola que no hace más que tratar de conectarse a la base de datos utilizando el código que envió. Codificar la cadena de conexión en el programa de consola.

En otras palabras, eliminar todas las distracciones para asegurarse de que el código del núcleo que está intentando ejecutar realmente funciona correctamente.

Otros consejos

Como no hubo nunca una solución real proporcionada para este problema, aquí es la que me ayudó:

Yo tenía el mismo problema cuando actualicé una aplicación que funciona perfectamente ASP.NET 2.0 para .NET 3.5. La aplicación web está alojado por IIS 5.1 en Windows XP y estoy usando SQL Server 2005. Estoy usando la siguiente cadena de conexión en mi web.config:

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

Así que como ves, estoy haciendo ninguna conexión TCP aquí o se conecta a un servidor remoto. Sólo estoy conectando la instancia SQLEXPRESS en el host local a través de canalizaciones con nombre. Es por eso que pensé, que no tendrá absolutamente nada que ver con lo que permite conexiones remotas en SQL Server 2005. Sin embargo, como descubrí, lo hace! (No sé la razón real de esto!) Pasé un par de horas para descubrir eso, así que tal vez esto ayude a alguien ...

Lo que hay que hacer (por favor utilice Google para los detalles):

  1. Permitir Conexiones locales y remotas a través de SQL Server 2005 Surface Area Configuration Tool (Elijo la opción "Usar TCP / IP y canalizaciones con nombre")
  2. Habilitar el servicio Explorador de SQL Server
  3. Ajuste el puerto de escucha TCP para 1433 para todas las direcciones IP a través de la herramienta Administrador de configuración de SQL Server
  4. Disfrute de su aplicación web en ejecución: -)

¿Por qué todo esto es necesario con el fin de conectar con éxito de una aplicación .NET 3.5 Web a SQL Server cuando se trabaja ya desde .NET 2.0 es más que me!

Según esta , SQL 2005 no vienen configurados para permitir conexiones locales o remotas entrantes y hay que permitir que usted mismo.

Estoy seguro de que han pasado a través de estos pasos ya, pero ... prueba que permite la conexión remota para SQL Server y habilitar el servicio Explorador de SQL Server. Un tutorial para ambos se puede encontrar aquí .

Se podría tratar de usar otro tipo de cadena de conexión. Mis cadenas de conexión suelen ser formateados como:

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

son la otra aplicacion que ha dicho que están trabajando también NET 3.5 aplicaciones?


También estoy curioso cómo le hizo para obtener esta pieza de código de trabajo

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

Creo que significa

using (objConn = new SqlConnection(strConnectionString)) 

¿verdad?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top