2010-05-16 15 views
16

Cuando intento insertar un registro, aparece este error: El proveedor subyacente falló en Abrir. Este error ocurre solo con IIS y no con el servidor web de VWD 2008. En EventViewer obtengo este error de aplicación: Error al generar una instancia de usuario de SQL Server debido a un error al iniciar el proceso para la instancia de usuario. La conexión será cerrada. [CLIENTE:]Entity Framework: "El proveedor subyacente falló al abrir"

<add name="ASPNETDBEntities" 
    connectionString=" 
     metadata=res://*/Models.FriendList.csdl|res://*/Models.FriendList.ssdl|res://*/Models.FriendList.msl; 
     provider=System.Data.SqlClient; 
     provider connection string=&quot; 
     Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF; 
     Integrated Security=True; 
     Connect Timeout=30; 
     User Instance=True; 
     MultipleActiveResultSets=True&quot;" 
    providerName="System.Data.EntityClient" /> 

estoy usando archivo aspnetdb.mdf, y no una base de datos externa. He buscado lo suficiente para esto, pero no sirve.

Todo funciona bien con el servidor web VWD

Respuesta

9

Debe crear una cuenta de SQL para su servidor web para acceder a la base de datos aspnetdb. Actualmente usa autenticación integrada (intenta iniciar sesión con la identidad que el servidor web está utilizando para ejecutar la aplicación).

El ejemplo siguiente utiliza la autenticación integrada. Yo usaría SQL auth embargo.

http://msdn.microsoft.com/en-us/library/ff649314.aspx

+0

¿Cómo crear una cuenta sql? No estoy instalando Sqlserver 2008. Estoy usando Sqlserver 2008 express edition, que se instala con VWD 2008. Por lo tanto, no hay analizador de consultas ni administrador de empresa. – pokrate

+0

Instalar Microsoft SQL Server Management Studio Express http://www.microsoft.com/downloads/details.aspx?familyid=08E52AC2-1D62-45F6-9A4A-4B76A8564A2B&displaylang=en –

0

Añadir el atributo más adelante en la cadena de conexión que has dado.

<add 
    name="ASPNETDBEntities" 
    connectionString="metadata=res://*/Models.FriendList.csdl| 
         res://*Models.FriendList.ssdl|res://*/Models.FriendList.msl; 
         provider=System.Data.SqlClient;provider connection string=&quot; 
         Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF; 
         Integrated Security=True;Connect Timeout=30; 
         User Instance=True; 
         MultipleActiveResultSets=True&quot;" 
    ProviderName="System.Data.EntityClient" 
    User Instance="False"/> 
+0

Asumiendo su referencia muy oscura al "atributo de abajo" (¿A cuál se refiere exactamente?) es 'MultipleActiveResultSets = True', no funcionó para mí – Ortund

0

Quizás sea demasiado tarde para responder, pero tuve el mismo problema.

Agregué el tiempo de espera del alcance (5 minutos). Dejo un ejemplo.

Dim varIntervalo As New TimeSpan(0, 5, 0) 
Using varTransaccion As New TransactionScope(TransactionScopeOption.Required, varIntervalo) 
    For vari As Integer = 2 To varMatrizDatos.GetUpperBound(0) 
     Dim varWhateverAs New TABLE 
     varWhatever.ID_TABLE = something 
     varWhatever.DESC_TABLE = something else 
     varWhatever.DATE_TABLE = CDate(Now.Date) 

     varEntidades.AddToTABLESet(varWhatever) 
     varEntidades.SaveChanges() 
    Next 
    varTransaccion.Complete() 
End Using 

Posiblemente este código podría ser mejorable.

3

Me estaba dando el mismo problema y después de hacer la depuración vi que estoy creando la nueva instancia de DB Entity en cada acción y hacer una nueva instancia de Db Entity significa abrir una nueva conexión con db.

A continuación se muestra el código:

Private tmpConnection As New DbModel.DbEntities 

así llamando la variable y otra vez su creación nueva instancia de DbEntites y la apertura de nueva conexión con db.

así que escribo una pequeña función para esto y eso resuelve mi problema. Ahora no hay más error.

Private tmpConnection As DbModel.DbEntities 

Public Function dbCon() As DbModel.DbEntities 

    If tmpConnection IsNot Nothing Then 

     If tmpConnection.Connection.State = ConnectionState.Closed Then 

      Try 
       tmpConnection.Connection.Open() 
       Return tmpConnection 
      Catch ex As Exception 
       My.Response.Redirect("dberror.aspx") 
      End Try 

     Else 

      Return tmpConnection 

     End If 

    Else 

     tmpConnection = New DbModel.DbEntities 

     Try 
      tmpConnection.Connection.Open() 
      Return tmpConnection 
     Catch ex As Exception 
      My.Response.Redirect("dberror.aspx") 
     End Try 

    End If 

    Return Nothing 
End Function 

y lo último en su conexión, por favor agregue "Connect Timeout = 30;"

eso que trabajan tan perfecto para mí

2

Usando nueva instancia de base de datos Entidad en cada acción no debe crear físicamente la conexión con el servidor SQL. Entity Framework utilizará el conjunto de conexiones creado para su (proceso, dominio de la aplicación, cadena de conexión) como está configurado en su cadena de conexión para evitar la creación de nuevas conexiones.

Este problema es muy ambiental y ajustar parámetros (en la cadena de Conn), como a continuación se debe resolver el problema-

Min Tamaño de la piscina = 1;

Max Pool Size = 100; // predeterminado

Tiempo de espera de conexión = 15; // en segundos

Pooling = true;

+0

Esta respuesta lo hizo por mí. Doblé los valores predeterminados del parámetro 'Max Pool Size' y' Connection Timeout'. Información completa aquí: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx Anterior a esto, aunque cambié a ** SQL Server * * de ** autenticación de Windows ** y se aseguró de que 'DTC' estuviera en funcionamiento y permitiendo clientes remotos que no solucionaron mi problema, pero creo que también fueron necesarios. –

0

Además, esta excepción se produce cuando la tabla se va a manipular se elimina o no existe

0

Esta excepción parece ser lanzado cuando no hay nada que pueda hacer que su cadena de conexión no sea válida. Las credenciales inválidas fueron la causa para mí.

1

En mi caso, estaba usando Sql CE, y mi cadena de conexión se configuró con una ruta absoluta en lugar de inf | el Directorio de datos | variable. Cambió esto y comenzó a trabajar en el servidor.

Obviamente, funcionó bien en la máquina de desarrollo.

0

Estaba teniendo un problema similar y también estoy usando IIS. Abrí una ventana de comando y escribí iisreset. Problema resuelto.

0

Este problema se produce cuando la Base de datos se agregó en ServerExplorer como autenticación de Windows. Cuando usa la autenticación sql en el momento de la base de datos agregada en ServerExplorer, el problema se resuelve. Si sigue usando la autenticación de Windows y evita esta excepción, proporcione el id. De usuario y la contraseña de la base de datos en connectionstring en el archivo webconfig.

Este problema surge solo cuando alojamos el servicio en IIS

Cuestiones relacionadas