Error de MSSQL 'El proveedor subyacente falló al abrir'

220

Estaba usando un .mdfpara conectarse a un databasey entityClient. Ahora quiero cambiar la cadena de conexión para que no haya ningún .mdfarchivo.

¿Es connectionStringcorrecto lo siguiente ?

<connectionStrings>
   <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
   <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Porque siempre recibo el error:

El proveedor subyacente falló en la apertura

senzacionale
fuente
2
Tengo el mismo problema aquí cuando intento ejecutar bajo IIS. Si ejecuto en VS Server no obtengo ningún error.
Zote
11
Tuve el mismo problema y me eliminé Integrated Securityde la cadena de conexiones, creé un usuario y me aseguré de que tuviera sysadminpermisos y agregué a ese usuario a la cadena de conexiones.
fulvio
dónde se encuentra su base de datos, si está en una aplicación alojada en IIS, debe colocar su base de datos en su carpeta App_Data y editar la cadena de conexión generada por el modelo Entityframework para buscarla allí. stackoverflow.com/questions/9809442/…
eran otzap
Tuve este problema y se resolvió insertando la contraseña en la cadena de conexión.
satyrFrost
Simplemente eliminar Integrated Security funcionó para mí cuando se ejecuta bajo IIS
Jon

Respuestas:

215

Tuve este error y encontré algunas soluciones:

Mirando su cadena de conexión, parece válida. Encontré esta publicación de blog , el problema aquí es que estaban usando Seguridad Integrada . Si está ejecutando en IIS, su usuario de IIS necesita acceso a la base de datos.

Si está utilizando Entity Framework con Transactions , Entity Framework abre y cierra automáticamente una conexión con cada llamada a la base de datos. Entonces, cuando usa transacciones, está tratando de extender una transacción a través de múltiples conexiones. Esto se eleva a MSDTC .

( Consulte esta referencia para obtener más información ) .

Cambiar mi código a lo siguiente lo arregló:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}
Christian Payne
fuente
77
¿Cómo se hace esto cuando se usa Linq para acceder a las tablas (usando EF4)?
Brett Rigby
2
@Brett Rigby: stackoverflow.com/questions/794707/… cubre cómo hacer esto con Linq / EF.
Scott Stafford
63
Si está utilizando EF / DBContext, la llamada correcta es context.Database.Connection.Open ();
live-love
2
Ojalá leyera tu publicación en lugar de leerla por código cuando la encontré por primera vez. Mi problema (como se señaló en esta respuesta) fue que el usuario de AppPool para el contexto del complemento CRM 2011 no tenía acceso de escritura a la base de datos que había configurado. Cuando agregué el usuario a SQL, el complemento funcionó de maravilla.
Mike_Matthews_II
2
No tenía una cadena de conexión en mi configuración con el nombre del contexto que estaba creando ... verifique eso también.
Bill Blankenship
38

context.Connection.Open() no ayudó a resolver mi problema, así que intenté habilitar "Permitir clientes remotos" en la configuración de DTC, no más errores.

En Windows 7, puede abrir la configuración de DTC ejecutando dcomcnfg, Servicios de componentes -> Computadoras -> Mi computadora -> Coordinador de transacciones distribuidas -> Haga clic derecho en DTC local -> Seguridad.

kerem
fuente
11
En Windows 7, puede abrir la configuración de DTC ejecutando dcomcnfg , Servicios de componentes -> Computadoras -> Mi computadora -> Coordinador de transacciones distribuidas -> Haga clic derecho en DTC local -> Seguridad.
kerem
77
En realidad, es clic derecho en DTC local -> Propiedades -> Seguridad
Otto Abnormalverbraucher
27

Debería ver innerException para ver cuál es la causa interna del lanzamiento del error.

En mi caso, el error original fue:

No se puede abrir el archivo físico "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Error del sistema operativo 5: "5 (acceso denegado)". Error al intentar adjuntar una base de datos con nombre automático para el archivo D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf. Existe una base de datos con el mismo nombre, o el archivo especificado no se puede abrir, o se encuentra en el recurso compartido UNC.

que se resolvió dando permiso completo al usuario actual para acceder a archivos relacionados mdfy ldfutilizando las propiedades de los archivos.

Majid
fuente
24

Encontré que el problema era que tenía la ruta del servidor dentro de la cadena de conexión en una de estas variantes:

SERVER\SQLEXPRESS
SERVER

Cuando realmente debería tener:

.\SQLEXPRESS

Por alguna razón, recibí el error cada vez que tenía dificultades para localizar la instancia de SQL.

dooburt
fuente
66
Esto puede deberse a que no tiene habilitadas las canalizaciones con nombre como método de conexión para SQL Server.
Paul
1
@ Paul, gracias. Era probable que, como era una nueva instalación de SQL, que se despliega con las canalizaciones con nombre deshabilitadas. Gracias por el aviso. +1
dooburt
1
Gracias por esto, tuve este problema debido a que las canalizaciones con nombre estaban deshabilitadas.
Patrick Allwood el
15

Este es un problema común solamente. Incluso me he enfrentado a este problema. En la máquina de desarrollo, configurada con autenticación de Windows, funciona perfectamente:

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Una vez alojado en IIS con la misma configuración, recibí este error:

El proveedor subyacente falló en la apertura

Se resolvió cambiando connectionStringen el archivo de configuración:

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Otros errores comunes podrían ser:

  1. El servicio de base de datos podría detenerse
  2. Atributos del origen de datos que apuntan a una base de datos local con autenticación de Windows y están alojados en IIS
  3. El nombre de usuario y la contraseña pueden estar equivocados.
JaiSankarN
fuente
Para mí, el problema fue que cuando creé el modelo de datos EF, creó una cadena de conexión que usa los datos de inicio de sesión de las Conexiones de datos en VS. No había ningún usuario o contraseña en la cadena de conexión, así que elimínelo Integrated Security=Truey reemplácelo user id=sa;password=notmyrealpasswordpara solucionar este problema de implementación.
LostNomad311
10

Cuando reciba esta excepción, asegúrese de expandir los detalles y ver los detalles internos de la excepción, ya que proporcionará detalles sobre por qué falló el inicio de sesión. En mi caso, la cadena de conexión contenía un usuario que no tenía acceso a mi base de datos.

Independientemente de si usa la Seguridad integrada (el contexto del usuario de Windows conectado) o una cuenta SQL individual, asegúrese de que el usuario tenga acceso adecuado en 'Seguridad' para la base de datos a la que está intentando acceder para evitar este problema.

atconway
fuente
Tengo el mismo problema que la publicación original, verifiqué mi nombre de host y verifiqué en la excepción interna que estoy usando el nombre de usuario correcto. La seguridad del usuario de SSMS parece correcta: la cuenta de SQL Server está configurada correctamente y tiene acceso público a la base de datos. Pero, el inicio de sesión falló.
Códigos con Hammer
¿Cuál inner exceptiones el problema del estado? Esa fue mi respuesta aquí, que proporcionará los detalles adicionales ocultos necesarios para comprender el verdadero problema subyacente. El inner exceptionno va a comprobar que tiene el inicio de sesión correcta - no es una excepción una aclaración.
atconway
Login failed for user 'user'.
Códigos con Martillo
También intenté agregar NT AUTHORITY\NETWORK SERVICEa la lista de usuarios de SQL Server. Todavía recibí el mismo error de inicio de sesión rechazado.
Códigos con Martillo
Resuelto Necesitaba cambiar data sourcea hostname\SQLEXPRESS. Lo había intentado hostnamey .\SQLEXPRESSanteriormente. Luego pude conectarme con seguridad integrada. Curiosamente, esto es lo opuesto a la respuesta de dooburt . Curiosamente, el nombre de usuario de SQL Server nunca pudo conectarse desde Visual Studio.
Códigos con Martillo
4

El servicio SQL Server Express no se configuró para iniciarse automáticamente.

1) Vaya al panel de control 2) Herramientas administrativas 3) Servicio 4) Configure SQL Server express para que se inicie automáticamente haciendo clic en él 5) Haga clic derecho e inicie el servicio

Espero que le ayudará.

usuario2033790
fuente
3

Esto también puede suceder si restaura una base de datos y el usuario ya existe con un esquema diferente, dejándolo incapaz de asignar los permisos correctos.

Para corregir esta ejecución:

USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO
79E09796
fuente
Absolutamente este era el problema. Acabo de restaurar desde una copia de seguridad. Echa un vistazo al análisis detallado.
nesimtunc
2

Asegúrese de que cada valor de elemento en la cadena de conexión suministrada sea correcto. En mi caso, recibí el mismo error porque el nombre del catálogo (nombre de la base de datos) especificado en la cadena de conexión era incorrecto.

Rajesh
fuente
1

Tuve un problema similar con excepciones debido al estado de conexión, luego me di cuenta de que mi variable de clase de servicio de dominio estaba marcada como estática (por error).

Supongo que una vez que la biblioteca de servicios se carga en la memoria, cada nueva llamada termina usando el mismo valor de variable estática (instancia de servicio de dominio), lo que causa conflictos a través del estado de conexión.

Creo también que cada llamada de cliente resultó en un nuevo hilo, por lo que múltiples hilos que acceden a la misma instancia de servicio de dominio equivale a un choque de trenes.

James Wilkins
fuente
Esto es lo que hizo por mí también. Parece que si lo marca como estático, solo causa todo tipo de problemas con la instancia con la que está tratando de trabajar.
Michael J. Gray
1

Tuve el mismo problema, pero lo que funcionó para mí fue eliminar esto de la cadena de conexión:

persist security info=True

FV01
fuente
1

Tuve un error similar con la excepción interna que se muestra a continuación:

la operación no es válida para el estado de la transacción

Podría resolverlo habilitando la configuración de seguridad DTC.

Vaya a Propiedades de DTC, en la pestaña Seguridad, verifique lo siguiente

  • Acceso a la red DTC
  • Permitir clientes remotos
  • Comunicación del gerente de transacciones
  • Permitir entrada
  • Permitir saliente
Sparea
fuente
1

Si aparece este error en una aplicación web ASP.NET, además de otras cosas mencionadas, verifique lo siguiente:

  1. Permisos de seguridad de usuario de la base de datos (qué usuarios tienen acceso a su base de datos.
  2. Verifique su grupo de aplicaciones en IIS y asegúrese de que sea el correcto al que se le permite el acceso a su base de datos.
alexk
fuente
1

Me deshice de esto reiniciando IIS , pero aún lo uso Integrated Authenticationen la cadena de conexión.

Ravi Thiagarajan
fuente
1

La definición de una nueva regla de Firewall de Windows para SQL Server (y para el puerto 1433) en la máquina del servidor resuelve este error (si su nombre de servidor, nombre de usuario o contraseña no es incorrecto en su cadena de conexión ...).

Gökhan Yılmaz
fuente
0

Un error común que cometí porque estaba moviendo la aplicación de una PC a otra y nada de lo anterior funcionó fue que olvidé copiar la cadena de conexión a App.Config y Web.Config.

rikket
fuente
0

Tuve un problema similar: en mis ejecuciones de casos de prueba siempre recibí este error. Descubrí que mi "Servicio de transacciones distribuidas" no se inició (ejecute: services.msc -> inicie el "Servicio de transacciones distribuidas" (lo mejor es configurarlo para que se inicie automáticamente)). Después de hacer eso, funcionó a las mil maravillas ...

iber
fuente
0

Copié los archivos de la base de datos (.mdf / .ldf) a la carpeta App_Data para eliminar esta excepción.

mdc
fuente
0

También estaba enfrentando el mismo problema. Ahora lo he hecho eliminando el nombre de usuario y la contraseña de la cadena de conexión.

usuario2650536
fuente
0

Para mí fue solo un simple error:

Utilicé Amazon EC2 y utilicé mi dirección IP elástica en la cadena de conexión, pero cuando cambié las direcciones IP olvidé actualizar mi cadena de conexión.

Erez Robinson
fuente
0

Este error ocurrió repentinamente de la nada en uno de nuestros sitios. ¡En mi caso, resultó que la contraseña del usuario SQL había expirado! Desmarcar el cuadro de caducidad de la contraseña en SQL Server Management Studio hizo el truco.

Connell
fuente
0

En IIS, configure la cuenta de usuario o cuenta de administrador de la Identidad de grupo de aplicaciones o la cuenta de hormiga que tiene permiso para realizar la operación en esa base de datos.

Jaydeep Shil
fuente
0

En mi caso, tuve una discrepancia entre el nombre de la cadena de conexión que estaba registrando en el constructor del contexto y el nombre en mi web.config. Error simple causado por copiar y pegar: D

    public DataContext()
        : base(nameOrConnectionString: "ConnStringName")
    {
        Database.SetInitializer<DataContext>(null);
    }

dEVmARCO
fuente
0

Tengo el mismo error que encontré cuando cambio mi stringString a una nueva fuente de datos. Olvidé cambiar el nombre de usuario y contraseña para la nueva base de datos.

Hamza Yahia
fuente
0

También he tenido este error si no se especifica el nombre de la instancia de SQL Server y el host SQL tiene instaladas varias instancias de SQL. Aquí hay un par de ejemplos para aclarar:

La siguiente cadena de conexión da como resultado la excepción "El proveedor subyacente falló en Abrir" sin excepción interna en una aplicación .NET WebForms:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

La siguiente cadena de conexión se ejecuta como se espera en una aplicación .net WebForms donde el entorno SQL tiene múltiples instancias. Raro, lo sé, pero tengo algunas instancias SQL diferentes en mi cuadro de desarrollo para dar cabida a diferentes proyectos:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"
Sam Ellis
fuente
0

en mi caso, la dirección del servidor ha sido cambiada por el administrador del servidor, así que tuve que cambiar la cadena de conexión a la nueva dirección del servidor

Ali Sadri
fuente
0

Tuve este problema porque el inicio de sesión del grupo de aplicaciones con el que se ejecutaba esta aplicación había cambiado.

En IIS:

  • Encuentre el grupo de aplicaciones haciendo clic en su sitio y vaya a Configuración básica.

  • Vaya a Grupos de aplicaciones.

  • Haga clic en el grupo de aplicaciones de su sitio.

  • Haga clic en Configuración avanzada.

  • En Identidad, ingrese el nombre de usuario y la contraseña de la cuenta.

  • Reinicie su sitio e intente nuevamente.

vive el amor
fuente