2012-06-24 29 views
5

Aparentemente, usar AttachDbFilename y user instance en su cadena de conexión es una mala manera de conectarse a un DB. Estoy usando SQL Server Express en mi máquina local y todo parece funcionar bien. Pero, ¿cuál es la forma correcta de conectarse al servidor SQL?cuál es el problema con AttachDbFilename

Gracias por su explicación.

Respuesta

11

El uso de User Instance significa que SQL Server está creando una copia especial de ese archivo de base de datos para que lo utilice su programa. Si tiene dos programas diferentes que usan esa misma cadena de conexión, obtienen dos copias completamente diferentes de la base de datos. Esto lleva a un lote de confusión, ya que las personas probarán la actualización de datos con su programa, luego se conectarán a una copia diferente de su base de datos en Management Studio, y se quejarán de que su actualización no está funcionando. Esto los envía a través de una serie defectuosa de pasos de búsqueda de ganso salvaje tratando de solucionar el problema equivocado.

This article goes into more depth about how to use this feature, pero preste atención a la primera nota: la característica User Instance ha quedado en desuso. En SQL Server 2012, las alternativas preferidas son (en este orden, en mi humilde opinión):

  1. Crear o adjuntar la base de datos a una instancia real de SQL Server. Su cadena de conexión solo tendrá que especificar el nombre de la instancia, el nombre de la base de datos y las credenciales. No habrá confusión ya que Management Studio, Visual Studio y su (s) programa (s) se conectarán a una sola copia de la base de datos.

  2. Utilice SqlLocalDb para el desarrollo local. Creo que te indiqué este artículo ayer: "Getting Started with SQL Server 2012 Express LocalDB".

  3. Use SQL Server Compact. Me gusta menos esta opción porque la funcionalidad y la sintaxis no son las mismas, por lo que no necesariamente le proporcionarán todas las funcionalidades que finalmente desea implementar. Compact Edition is also deprecated, so there's that.

Por supuesto, si está utilizando una versión < SQL Server 2012, SqlLocalDb no es una opción - por lo que debe crear una base de datos real y el uso que de forma coherente. Solo menciono la opción Compacta de completitud. Creo que puede ser una idea tan mala como usar AttachDbFileName.

EDIT: he blogged sobre esto aquí:

+0

ah bien, ahora lo entiendo: eliminé el parámetro UserInstance = true de la cadena de conexión y parece funcionar bien. ¿Y el parámetro AttachDbFileName? ¿Cuál es el peligro con eso? – frenchie

+0

¿Por qué solo querría adjuntar la base de datos mientras su programa la está usando? Si adjunta la base de datos * a su servidor SQL *, puede acceder a ella a través de Management Studio u otros programas en cualquier momento. ¿Qué estás ganando al conectarlo solo en tiempo de ejecución mientras estás desarrollando activamente? Si se trata de uso de recursos, puede detener manualmente el servicio de SQL Server. –

+0

No estaba seguro de lo que estaba haciendo el comando. En este momento, tengo esto: Data Source =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ MySiteDB.mdf. ¿Cómo debería reescribirlo para evitar el archivo adjunto al tiempo de ejecución y, en su lugar, ir directamente al servidor SQL? Adjunté el archivo DB al servidor SQL adjuntándolo en Management Studio. ¿Es esto bueno? – frenchie

-1

En caso de que alguien tenía el problema.

Al montar la base de datos con una cadena de conexión que contiene AttachDBFile con SQLEXPRESS, me di cuenta de esta conexión era exclusivo de la aplicación ASP.NET que estaba utilizando la base de datos. La conexión bloqueó el acceso a todos los otros procesos en el nivel de archivo cuando se hizo con System.Data.SqlClient como proveedor.

Con el fin de asegurar que la conexión sea compartible con otros procesos en lugar de utilizar bases de datos para especificar el nombre de base de datos en la cadena de conexión Ejemplo o conexión de cadena:

Data Source=.\SQLEXPRESS;DataBase=PlaCliGen;User ID=XXX;password=ZZZ; Connect Timeout=30 

, donde PlaCliGen es el nombre (o nombre lógico) mediante el cual el servidor SQLEXPRESS conoce la base de datos.

Al conectarse a la base de datos con AttachDBFile dando la ruta al archivo .mdf (namely : replacing DataBase = PlacliGen by AttachDBFile = c:\vs\placligen\app_data\placligen.mdf) el archivo se conectó exclusivamente y ningún otro proceso podría conectarse a la base de datos.

Cuestiones relacionadas