2010-07-11 7 views
21

Utilizzo Visual Studio 2008 Pro.Impossibile ottenere SQL Server compatto 3.5/4 per lavorare con ASP .NET MVC 2

Probabilmente mi manca qualcosa di molto ovvio qui, ma ho cercato di ottenere il CTP per Sql Server compact 4 per funzionare nella mia applicazione asp.net mvc. Posso trovare accanto a nessuna istruzione su come impostare questo o un'applicazione di esempio di lavoro. Il mio obiettivo è un'installazione privata, quindi posso includerlo nella mia app Web senza dover eseguire l'installazione di SQL Server sul mio hosting di dominio. Questo è davvero solo me che spara al vento e sto cercando di capirlo. Non ho intenzione di ospitare un mercato o qualcosa di simile.

Quindi, ho copiato tutte le DLL installate nella direzione di base 4.0 (c: \ Programmi \ Sql Server compact \ v4.0) in una cartella lib nella mia applicazione. Ho impostato l'opzione di uscita della copia in uscita su "Copia se nuovo". Quindi faccio riferimento alla DLL System.Data.SqlServerCE e imposta "Copia locale" su True.

Ho creato un file sdf tramite Sql Studio Express. Una nota importante è che non ho visto un'opzione per creare una versione CE 4.0 di questo file, quindi è stata creata utilizzando CE 3.5. Creo alcune tabelle, aggiungo alcune righe a quelle tabelle, copia il file * .sdf nella directory App_Data. Vale la pena ricordare che, all'interno di VS 2008, questo file non viene mai visualizzato nel mio progetto, ma esiste nella posizione fisica della directory App_Data. Non sono sicuro del perché questo sia.

Avanti, ho solo provare a fare una connessione di base al mio file sdf tramite:

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

Questo produce il seguente errore:

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. 

ho dato da qui, avevo appena provare a ottenere Sql CE 3.5 per funzionare. Aggiorno la mia installazione locale di Sql CE 3.5 a sp2. Copio le DLL nel percorso di base (c: \ Programmi \ Sql Server compact \ v3.5), inclusa la rimozione e la lettura della versione della DLL System.Data.SqlServerCE dai riferimenti del mio progetto.

La cosa curiosa qui è quando clicco e guardo le proprietà della dll SqlServerCE di riferimento, dice sempre che è la versione 4.0.0.1.

Ragazzi, potrei davvero usare qualche direzione qui. Ho cercato lo stack overflow, i documenti di aiuto, i libri online e su Google. Non ho davvero trovato nulla che lo porti da cima a CE 3.5 o 4.0 e mi dice esattamente che cosa aggiungere, dove metterli, come fare riferimento a loro, come aggiungere il file .sdf al mio progetto, connettersi ad esso e interrogare da esso. Mi sono imbattuto in alcune menzioni di un'app campione del portale IBuySpy che avrebbe dovuto usare Sql CE 3.5, ma in realtà non è possibile navigare nel labirinto di download di msdn per arrivarci. Idealmente, voglio configurare una distribuzione privata per CE 4.0.

Sono tutto orecchie. Suggerimenti, punti, qualunque cosa sarebbe molto apprezzata. Grazie!

SI VEDO IL KB. Non ha aiutato

vederlo qui: http://support.microsoft.com/kb/974247

RISULTATI DA CORFLAG

Va bene, provato e questi sono i miei risultati: C: \ Sviluppo \ Mvc2MessingAround \ Mvc2MessingAround \ bin \ Lib> corflags System.Data. SqlServerCe.dll Strumento di conversione CorFlags di Microsoft (R) .NET Framework. Versione 3.5.21022.8 Copyright (c) Microsoft Corporation. Tutti i diritti riservati.

Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 9 
ILONLY : 1 
32BIT  : 0 
Signed : 1 

Avrei giurato di aver installato la versione x86 di entrambe le versioni di Sql CE (3.5/4). L'installer potrebbe essersi confuso in qualche modo perché il mio processore è a 64 bit, ma sto usando Windows xp sp 3 a 32 bit. I risultati sembrano indicare che è a 64 bit. È questo il caso?

Aggiunto dettagli

Ad oggi le configurazioni di seguito sono stati provati su 2 macchine. Entrambi sono Windows xp sp3 a 32 bit con un processore con 64 bit. L'ambiente di sviluppo su entrambi è VS 2008 Pro. I risultati sulla macchina 2 vengono dopo una nuova installazione di Sql CE 4 Ctp.

CONFIGURAZIONE # 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 

Errore:

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. 

Codice:

SqlCeConnection conn = new SqlCeConnection(); 

CONFIGURAZIONE 2

Uguale al numero 1, ma con System.Data.SqlServerCE.Entity.dll in direzione myapp \ bin.

Gli errori di pagina prima di colpire il codice sopra. Questo è il messaggio:

Impossibile caricare il file o l'assembly 'System.Data.SqlServerCe.Entity' o una delle sue dipendenze. Questo assembly è creato da un runtime più recente rispetto al runtime attualmente caricato e non può essere caricato.

Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.BadImageFormatException: impossibile caricare il file o l'assembly 'System.Data.SqlServerCe.Entity' o una delle sue dipendenze. Questo assembly è creato da un runtime più recente rispetto al runtime attualmente caricato e non può essere caricato.

Ho verificato le impostazioni del progetto in VS 2008 Pro e il framework .Net 3.5 è impostato come obiettivo.

CONFIGURAZIONE 3

Stesso come # 1, ad eccezione del System.Data.SqlServerCe.dll viene fatto riferimento dal myapp \ bin \ cartella privata.

I risultati sono uguali a CONFIGURAZIONE N. 1 (il messaggio di errore è uguale al 100% e l'errore si verifica sulla stessa riga di codice).

configurazione corretta

secondo le istruzioni del Erik (li avevo ho seguito con più attenzione), la messa a punto dovrebbe essere

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

riferimento lo System.Data.SqlServerCE.dll direttamente dalla cartella bin per il codice. La mia follia era pensare che la cartella privata dovesse essere inclusa, ma non è così. Non inserire System.Data.SqlServerCE.Entity.dll nella cartella bin a meno che non si stia utilizzando una soluzione .net 4.0. Non penso che la dll funzioni con 3.5.

Link utili:

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 è Qualsiasi CPU .. – ErikEJ

+0

Utilizzo di config 3, nessun file Entity.dll. Struttura delle cartelle errata! Copia i seguenti contenuti della directory (incluse le cartelle x86 e amd64) nella cartella bin della tua app ASP.NET: C: \ Programmi \ Microsoft SQL Server Compact Edition \ v4.0 \ Private Non ci dovrebbe essere nessuna cartella "Privata" in la tua cartella bin asp.net. Sotto la cartella bin, una cartella x86 e amd64, ognuna con i file corretti. – ErikEJ

+0

Questo accade anche con VS 2010 e ASP.NET MVC 3 Beta – Jedidja

risposta

31

SQL CE 3.5 non funziona con ASP.NET, è necessario utilizzare 4.0 CTP.

Download da here.

Installare il runtime.

Copiare i seguenti contenuto della directory (compresa la x86 e amd64 cartelle) nella cartella bin della vostra applicazione ASP.NET: C: \ Programmi \ Microsoft SQL Server Compact Edition \ v4.0 \ privata

UPDATE: Utilizzare System.Data.SqlServerCe.dll dalla cartella Desktop per evitare Medium trust emette

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 

Aggiungere un riferimento alla System.Data.SqlServerCe.dll file appena messo nella cartella/bin.

Inserire il file sdf di SQL Compact nella cartella App_Data.

Add stringa di connessione:

<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

Ha fatto tutto ciò che hai suggerito qui. Sto ancora ottenendo lo stesso 'Impossibile caricare i componenti nativi di SQL Server Compact corrispondenti al provider ADO.NET della versione 8402. Installare la versione corretta di SQL Server Compact. Fare riferimento all'articolo KB 974247 per ulteriori dettagli. " errore ogni volta che provo a creare un nuovo oggetto SqlCEConnection. Ho pulito i miei file temporanei, chiuso VS 2008, pulito il progetto, ricostruito, ecc. Pensieri? – jason

+0

Siamo spiacenti, testato con VS 2010 e .NET 4.0 - forse è necessario? Prova il VS 2010 Web Dev Express gratuito ... – ErikEJ

+0

Questo puzzerebbe davvero se è come il mio hosting non offre ancora .net 4.0. Sicuramente penserei che avrebbero preso di mira il framework 3.5 sp1 per questo, ma potrebbero non averlo. – jason

2

OK, ecco una supposizione, dal momento che si pesca per loro.

Eseguire corflags.exe sull'assembly copiato nella directory dei riferimenti. Che tipo di macchina stai costruendo? Se sei su una macchina a 64 bit e stai compilando su x64 o anyCpu, assicurati che corflags ti dica che i tuoi riferimenti non sono riferimenti a 32 bit. Forse è "ricadere" su una versione errata del tuo GAC o qualcosa del genere. Se ti dice che l'assembly di riferimento è solo a 32 bit, puoi compilare il tuo progetto come un progetto a 32 bit o trovare una versione a 64 bit della DLL?

13

Se la vostra utilizzando una stringa di connessione che utilizza un providerName e non è stato installato l'SDK, allora avete anche bisogno di aggiungere questo a voi 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 "rimozione" è necessario nel caso in cui è stato installato l'SDK, come che metterà queste informazioni nel vostro machine.config

+4

Grazie! Questo ha risolto un problema che stavo combattendo. Ma perché funziona? System.Data.SqlServerCe.dll ha un numero di versione di 4.0.8435.1 sul mio sistema e gli obiettivi di bindingRedirect 4.0.0.0-4.0.0.1. Quindi, perché bindingRedirect influisce anche sulla situazione in questo caso? Sono contento che funzioni, semplicemente non capisco perché. Puoi chiarire questo per me? –

+0

Solo per scopi di riferimento @ScottBussinger: Penso che si possa saltare l'elemento '' e usare 4.0.0.0 su ''. Se si utilizza 4.0.0.1 su quest'ultimo, è effettivamente necessario aggiungere l'associazione. –

0

la chiave per me è stata rendersi conto che la versione di System.Data.SqlServerCe. Entity.dll nella directory privata (C: \ Programmi \ Microsoft SQL Server Compact Edition \ v4.0 \ Private) 4.0.0.1, in cui la versione sotto la directory Desktop (C: \ Programmi \ Microsoft SQL Server Compact Edition \ v4.0 \ Desktop \ System.Data.SqlServerCe.Entity) è 4.0.0.0. La versione di System.Data.SqlServerCe.dll nella directory privata è 4.0.0.0.

Penso che sia stato un errore da parte di Microsoft distribuire un SqlServerCe.Entity.dll aggiornato senza un aggiornamento corrispondente a SqlServer.dll.

+2

La versione di assembly di System.Data.SqlServerCe.dll nella directory privata è 4.0.0.1! – ErikEJ

+0

I secondo Erik. Se si desidera distribuire con un'istanza CE privata, è necessario collegare il progetto alla versione 4.0.0.1 System.Data.SqlServerCe.dll trovata nella directory privata. Questo per evitare problemi futuri durante l'aggiornamento di SQLCE – Jonx

1

Se si sta installando il provider SQL CE utilizzando NuGet, la soluzione più semplice è quella di aggiungere un post-generazione passo per copiare questi dalla cartella NuGet NativeBinaries pacchetto

+0

Questa risposta sembra plausibile, ma non la capisco. Potresti, per favore, aggiungere un esempio del passaggio post-compilazione necessario? – ChrisW

+1

Copia le DLL dalla cartella dei pacchetti nella cartella bin utilizzando la tecnica descritta su http://stackoverflow.com/questions/491468/copy-files-from-one-project-to-another-after-build –

Problemi correlati