2010-07-11 34 views
21

Estoy usando Visual Studio 2008 Pro.No se puede obtener sql server compact 3.5/4 para trabajar con ASP .NET MVC 2

Probablemente me falta algo muy obvio aquí, pero he estado tratando de hacer 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 todas las dll de esa instalación en la dirección base 4.0 (c: \ Archivos de programa \ 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, sólo tratar de hacer una conexión básica a través de sdf:

SqlCeConnection conn = new SqlCeConnection("DataSource=rpg.sdf"); 

Esto produce el error abajo:

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. 

Calculo de aquí, que acababa de intentar conseguir Sql CE 3.5 para trabajar. 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 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Í, HE VISTO LA KB. No ayudó

lo ve aquí: http://support.microsoft.com/kb/974247

RESULTADOS DE CORFLAG

bien, intentado eso 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 

Hubiera jurado 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?

AÑADIDO DETALLES

Hasta la fecha, las configuraciones a continuación 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 n.º 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 anterior. 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.

He comprobado la configuración del proyecto en VS 2008 Pro y el marco .Net 3.5 se establece como el objetivo.

CONFIGURACIÓN 3

Igual que el # 1, a excepción de la System.Data.SqlServerCe.dll está referenciado desde el miaplicacion \ bin \ carpeta privada.

Los resultados son los mismos que en la CONFIGURACIÓ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 (tenía los seguí con más cuidado), la configuración debe ser

myapp\bin 
    x86 
    amd64 
    System.Data.SqlServerCE.dll 

Referencia del System.Data.SqlServerCE.dll directamente de la carpeta bin para 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:

http://blogs.msdn.com/b/sqlservercompact/archive/2010/07/07/introducing-sql-server-compact-4-0-the-next-gen-embedded-database-from-microsoft.aspx

+0

System.Data.SqlServerCe.dll es Cualquier CPU .. – ErikEJ

+0

Usando config 3, no hay archivo Entity.dll. Estructura de carpeta incorrecta! 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 \ Privado No debe haber una carpeta "Privada" en su carpeta asp.net bin. Debajo de su carpeta bin, una carpeta x86 y amd64, cada una con los archivos correctos. – ErikEJ

+0

Esto también ocurre con VS 2010 y ASP.NET MVC 3 Beta – Jedidja

Respuesta

31

SQL CE 3.5 no funciona con ASP.NET, debe usar 4.0 CTP.

Descargar de here.

Instalar el tiempo de ejecución.

Copia el siguiente contenido de directorio (incluyendo el x86 y AMD64 carpetas) a la carpeta bin de la aplicación ASP.NET: C: \ Archivos de programa \ Microsoft SQL Server Compact Edition \ v4.0 \ Private

ACTUALIZACIÓN: el uso System.Data.SqlServerCe.dll de la carpeta de escritorio para evitar confianza medio emite

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 

añadir una referencia a la System.Data.SqlServerCe.dll archivo que acaba de poner en la carpeta/bin.

Coloque el archivo sdf SQL Compact en su carpeta App_Data. cadena de conexión

Añadir:

<connectionStrings> 
    <add name ="NorthWind" 
    connectionString="data source=|DataDirectory|\Nw40.sdf" /> 
</connectionStrings> 

Connect! :-)

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())); 
      } 
     } 
    } 
+1

Hizo todo lo que sugirió aquí. Todavía obtengo el mismo mensaje "No se pueden cargar los componentes nativos de SQL Server Compact correspondientes al proveedor ADO.NET de la versión 8402. Instale la versión correcta de SQL Server Compact. Consulte el artículo KB 974247 para más detalles. error cada vez que intento crear un nuevo objeto SqlCEConnection. He limpiado mis archivos temporales, salido de VS 2008, limpio el proyecto, reconstruido, etc. ¿Pensamientos? – jason

+0

Lo siento, probé con VS 2010 y .NET 4.0. ¿Esto es obligatorio? Prueba gratis el VS 2010 Web Dev Express ... – ErikEJ

+0

Eso realmente apestaría si es porque mi hosting aún no ofrece .net 4.0. Ciertamente creo que apuntarían al framework 3.5 sp1 para esto, pero podrían no tenerlo. – jason

2

OK, aquí es una suposición, ya que está 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?

13

Si su uso de una cadena de conexión que utiliza un providerName y no ha instalado el SDK, entonces también hay que añadir esto a que 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: el "eliminar" que se necesita en caso de que instala el SDK, ya que hará poner esta información en su machine.config

+4

Gracias! Eso resolvió un problema con el que había estado luchando. ¿Pero POR QUÉ funciona? System.Data.SqlServerCe.dll tiene un número de versión de 4.0.8435.1 en mi sistema y su bindingRedirect apunta a 4.0.0.0-4.0.0.1. Entonces, ¿por qué el bindingRedirect incluso afecta la situación en este caso? Me alegro de que funcione, simplemente no entiendo por qué. ¿Puedes aclarar esto por mí? –

+0

Solo para fines de referencia @ScottBussinger: Creo que puede omitir el elemento '' y utilizar 4.0.0.0 en ''. Si usa 4.0.0.1 en este último, efectivamente debe agregar el enlace. –

0

la clave para mí fue darse 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 por parte de Microsoft distribuir un SqlServerCe.Entity.dll actualizado sin una actualización correspondiente a SqlServer.dll.

+2

La versión de ensamblado de System.Data.SqlServerCe.dll en el directorio privado es 4.0.0.1. – ErikEJ

+0

I segundo Erik. Si desea implementar con una instancia privada de CE, debe vincular su proyecto con la versión 4.0.0.1 de System.Data.SqlServerCe.dll que se encuentra en el directorio privado. Esto es para evitar problemas futuros al actualizar SQLCE – Jonx

1

Si va a instalar el proveedor de SQL CE usando NuGet, la solución más sencilla es añadir un paso posterior a la generación de copiar estos de la carpeta NativeBinaries paquete NuGet

+0

. Esta respuesta suena plausible pero no la entiendo. ¿Podría, por favor, agregar un ejemplo del paso necesario posterior a la construcción? – ChrisW

+1

Copie las DLL de la carpeta de paquetes a la carpeta bin utilizando la técnica descrita en http://stackoverflow.com/questions/491468/copy-files-from-one-project-to-another-after-build –

Cuestiones relacionadas