c# - tutorial - No se puede obtener SQL Server compacto 3.5/4 para trabajar con ASP.NET MVC 2
paginas web asp.net ejemplos (5)
La clave para mí fue darme cuenta de que la versión de System.Data.SqlServerCe.Entity.dll en el directorio privado (C: / Archivos de programa / Microsoft SQL Server Compact Edition / v4.0 / Private) es 4.0.0.1, donde la versión debajo del directorio de escritorio (C: / Archivos de programa / Microsoft SQL Server Compact Edition / v4.0 / Desktop / System.Data.SqlServerCe.Entity) es 4.0.0.0. La versión de System.Data.SqlServerCe.dll en el directorio privado es 4.0.0.0.
Creo que fue un error de parte de Microsoft distribuir un SqlServerCe.Entity.dll actualizado sin una actualización correspondiente a SqlServer.dll.
Estoy usando Visual Studio 2008 Pro.
Probablemente me esté perdiendo algo muy obvio aquí, pero he intentado que el CTP para Sql Server compact 4 funcione en mi aplicación asp.net mvc. Puedo encontrar al lado de ninguna instrucción sobre cómo configurar esto o una aplicación de ejemplo en funcionamiento. Mi objetivo es una instalación privada, así que puedo incluirlo en mi aplicación web sin tener que configurar el servidor sql en el alojamiento de mi dominio. Esto es realmente solo yo disparando la brisa y tratando de resolver esto. No planeo alojar un mercado o algo con esto.
Por lo tanto, he copiado todos los dll de esa instalación en la dirección de la base 4.0 (c: / Program Files / Sql Server compact / v4.0) a una carpeta lib en mi aplicación. Establecí la opción Copiar en dirección de salida en ''Copiar si es más nuevo''. Luego hago referencia a System.Data.SqlServerCE dll y establezco ''Copiar local'' a True.
Creé un archivo sdf a través de Sql Studio Express. Una nota importante es que no vi una opción para crear una versión CE 4.0 de este archivo, por lo que se creó utilizando CE 3.5. Creo algunas tablas, agrego algunas filas a esas tablas, copio el archivo * .sdf a mi directorio App_Data. Vale la pena mencionar que, desde VS VS 2008, este archivo nunca aparece en mi proyecto, pero sí existe en la ubicación física del directorio App_Data. No estoy seguro de por qué es esto.
A continuación, intento hacer una conexión básica a mi archivo sdf a través de:
SqlCeConnection conn = new SqlCeConnection("DataSource=rpg.sdf");
Esto produce el siguiente error:
Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.
Me imagino que desde aquí, solo trataría de obtener Sql CE 3.5 para que funcione. Actualizo mi instalación local de Sql CE 3.5 a sp2. Copio los dlls en la ubicación base (c: / Program Files / Sql Server compact / v3.5), incluida la eliminación y la lectura de la versión del dll System.Data.SqlServerCE de las referencias de mi proyecto.
Lo curioso es que cuando hago clic con el botón derecho y miro las propiedades del dll SqlServerCE al que se hace referencia, siempre dice que es la versión 4.0.0.1.
Chicos, realmente podría usar alguna dirección aquí. He buscado desbordamiento de pila, los documentos de ayuda, libros en línea y en Google. Realmente no he encontrado nada que tome esto desde la parte superior para CE 3.5 o 4.0 y me dice exactamente qué dll agregar, dónde ponerlos, cómo hacer referencia a ellos, cómo agregar el archivo .sdf a mi proyecto, conectarse a él, y consultar desde allí. Me encontré con algunas menciones de una aplicación de muestra de portal IBuySpy que se suponía que debía usar Sql CE 3.5, pero no podía navegar el laberinto de descarga msdn para acceder a ella. Idealmente, quiero configurar un despliegue privado para CE 4.0.
Soy todo oídos. Sugerencias, puntos, lo que sea muy apreciado. ¡Gracias!
SÍ, VÍ A LA KB. NO AYUDA
Véalo aquí: http://support.microsoft.com/kb/974247
RESULTADOS DE CORFLAG
De acuerdo, lo intenté y estos son mis resultados: C: / Desarrollo / Mvc2MessingAround / Mvc2MessingAround / bin / Lib> corflags System.Data. SqlServerCe.dll Microsoft (R) .NET Framework CorFlags Conversion Tool. Versión 3.5.21022.8 Copyright (c) Microsoft Corporation. Todos los derechos reservados.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 9
ILONLY : 1
32BIT : 0
Signed : 1
Juraría que instalé la versión x86 de ambas versiones de Sql CE (3.5 / 4). El instalador podría haberse confundido de alguna manera porque mi procesador tiene capacidad de 64 bits, pero estoy ejecutando Windows XP Sp 3 32 bit. Los resultados parecen indicar que es de 64 bits. Es ese el caso?
DETALLES AÑADIDOS
Hasta la fecha, las configuraciones siguientes se han probado en 2 máquinas. Ambos son Windows XP Sp3 de 32 bits con un procesador de 64 bits. El entorno de desarrollo en ambos es VS 2008 Pro. Los resultados en la máquina 2 vienen después de una nueva instalación del Sql CE 4 Ctp.
CONFIGURACIÓN # 1
myapp/bin/
System.Data.SqlServerCe.dll
myapp/bin/private
amd64
x86
myapp/bin/private/x86
sqlceca40.dll
sqlcecompact40.dll
sqlceer40EN.dll
sqlceme40.dll
sqlceqp40.dll
sqlcese40.dll
myapp/bin/private/amd64
sqlceca40.dll
sqlcecompact40.dll
sqlceer40EN.dll
sqlceme40.dll
sqlceqp40.dll
sqlcese40.dll
Error:
An exception of type ''System.Data.SqlServerCe.SqlCeException'' occurred in System.Data.SqlServerCe.DLL but was not handled in user code
Additional information: Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.
Código:
SqlCeConnection conn = new SqlCeConnection();
CONFIGURACIÓN 2
Igual que el # 1, pero con System.Data.SqlServerCE.Entity.dll en la dirección myapp / bin.
Los errores de página antes de presionar el código de arriba. Este es el mensaje:
No se pudo cargar el archivo o ensamblado ''System.Data.SqlServerCe.Entity'' o una de sus dependencias. Este ensamblado está creado por un tiempo de ejecución más nuevo que el tiempo de ejecución cargado actualmente y no se puede cargar.
Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción: System.BadImageFormatException: no se pudo cargar el archivo o ensamblado ''System.Data.SqlServerCe.Entity'' o una de sus dependencias. Este ensamblado está creado por un tiempo de ejecución más nuevo que el tiempo de ejecución cargado actualmente y no se puede cargar.
Revisé la configuración del proyecto en VS 2008 Pro y el framework .Net 3.5 se configuró como el objetivo.
CONFIGURACIÓN 3
Igual que el n. ° 1, excepto que se hace referencia a System.Data.SqlServerCE.dll desde la carpeta myapp / bin / private.
Los resultados son los mismos que en CONFIGURACIÓN N. ° 1 (el mensaje de error es 100% igual y el error ocurre en la misma línea de código).
CONFIGURACIÓN CORRECTA
Según las instrucciones de Erik (si los hubiera seguido con más cuidado), la configuración debería ser
myapp/bin
x86
amd64
System.Data.SqlServerCE.dll
Haga referencia a System.Data.SqlServerCE.dll directamente desde la carpeta bin para obtener el código. Mi locura era pensar que la carpeta privada necesitaba ser incluida, pero no es así. No coloque System.Data.SqlServerCE.Entity.dll en la carpeta bin a menos que esté utilizando una solución .net 4.0. No creo que dll funcione con 3.5.
Enlace útil:
OK, aquí está una suposición, ya que estás pescando para ellos.
Ejecute corflags.exe en el conjunto que copió en su directorio de referencias. ¿Para qué tipo de máquina estás construyendo? Si está en una máquina de 64 bits y está compilando a x64 o anyCpu, asegúrese de que corflags le diga que sus referencias no son referencias de solo 32 bits. Tal vez es "retroceder" a una versión incorrecta en su GAC o algo así. Si le dice que el ensamblado al que se hace referencia es solo de 32 bits, ¿compila su proyecto como un proyecto de 32 bits o encuentra una versión de 64 bits del archivo DLL?
SQL CE 3.5 no funciona con ASP.NET, debe usar 4.0 CTP.
Descargue desde here .
Instala el tiempo de ejecución.
Copie los siguientes contenidos del directorio (incluidas las carpetas x86 y amd64) en la carpeta bin de su aplicación ASP.NET: C: / Archivos de programa / Microsoft SQL Server Compact Edition / v4.0 / Private
ACTUALIZACIÓN: utilice System.Data.SqlServerCe.dll desde la carpeta de escritorio para evitar problemas de confianza media
myapp/bin/
System.Data.SqlServerCe.dll
myapp/bin/x86
sqlceca40.dll
sqlcecompact40.dll
sqlceer40EN.dll
sqlceme40.dll
sqlceqp40.dll
sqlcese40.dll
myapp/bin/amd64
sqlceca40.dll
sqlcecompact40.dll
sqlceer40EN.dll
sqlceme40.dll
sqlceqp40.dll
sqlcese40.dll
Agregue una referencia al archivo System.Data.SqlServerCe.dll que acaba de colocar en su carpeta / bin.
Coloque el archivo SQL sdf compacto en su carpeta App_Data.
Agregar cadena de conexión:
<connectionStrings>
<add name ="NorthWind"
connectionString="data source=|DataDirectory|/Nw40.sdf" />
</connectionStrings>
¡Conectar! :-)
using System.Data.SqlServerCe;
protected void Page_Load(object sender, EventArgs e)
{
using (SqlCeConnection conn = new SqlCeConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
conn.Open();
using (SqlCeCommand cmd = new SqlCeCommand("SELECT TOP (1) [Category Name] FROM Categories", conn))
{
string valueFromDb = (string)cmd.ExecuteScalar();
Response.Write(string.Format("{0} Time {1}", valueFromDb, DateTime.Now.ToLongTimeString()));
}
}
}
Si está instalando el proveedor de SQL CE con NuGet, la solución más simple es agregar un paso posterior a la compilación para copiarlos desde la carpeta NativeBinarios del paquete NuGet.
Si usa una cadena de conexión que usa un providerName y no ha instalado el SDK, entonces también debe agregar esto a su web.config (o app.config)
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
<bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0"/>
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
NOTA: la "eliminación" es necesaria en caso de que haya instalado el SDK, ya que eso colocará esta información en su máquina.config