web-dev-qa-db-fra.com

Impossible de faire fonctionner SQL Server compact 3.5/4 ASP .NET MVC 2

J'utilise Visual Studio 2008 Pro.

Il me manque probablement quelque chose de très évident ici, mais j’essaie de faire en sorte que le CTP de Sql Server compact 4 fonctionne dans mon application asp.net mvc. Je ne trouve pratiquement aucune instruction sur la façon de configurer ceci ou un exemple d'application. Mon objectif est une installation privée afin que je puisse simplement l'inclure dans mon application Web sans avoir à configurer le serveur SQL sur mon hébergement de domaine. Ceci est vraiment juste moi tirant la brise et essayant de comprendre cela. Je n'ai pas l'intention d'accueillir un marché ou quoi que ce soit avec cela.

J'ai donc copié toutes les dll installées dans le sens base 4.0 (c:\Program Files\SQL Server compact\v4.0) dans un dossier lib de mon application. J'ai défini l'option Copier dans la direction de la sortie sur "Copier si plus récent". Je fais ensuite référence à la DLL System.Data.SqlServerCE et définit 'Copy Local' sur True.

J'ai créé un fichier sdf via Sql Studio Express. Une remarque importante est que je ne voyais pas d'option pour créer une version CE 4.0 de ce fichier. Il a donc été créé à l'aide de CE 3.5. Je crée quelques tables, ajoute quelques lignes à ces tables, copie le fichier * .sdf dans mon répertoire App_Data. Il convient de mentionner que, à l’intérieur de VS 2008, ce fichier n’apparaît jamais dans mon projet, mais qu’il existe à l’emplacement physique du répertoire App_Data. Je ne sais pas pourquoi c'est.

Ensuite, je tente simplement d’établir une connexion de base à mon fichier sdf via: 

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

Cela donne l'erreur ci-dessous: 

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.

Je suppose que je vais essayer d’obtenir Sql CE 3.5 au travail. J'ai mis à niveau mon installation locale de Sql CE 3.5 vers sp2. Je copie les dll à l'emplacement de base (c:\Program Files\SQL Server compact\v3.5), notamment en supprimant et en lisant la version de la dll System.Data.SqlServerCE de mes références de projet. 

La chose curieuse ici est quand je fais un clic droit et regarde les propriétés de la DLL référencée SqlServerCE, il dit toujours que c'est la version 4.0.0.1. 

Les gars, je pourrais vraiment utiliser une certaine direction ici. J'ai recherché pile débordement, la documentation d'aide, des livres en ligne et googlé. Je n'ai vraiment rien trouvé qui tienne le premier rôle pour CE 3.5 ou 4.0 et me dise exactement ce que les dll doivent ajouter, où les placer, comment les référencer, comment ajouter le fichier .sdf à mon projet, connectez-vous à celui-ci et interrogez-le. J'ai rencontré quelques exemples d'un exemple d'application de portail IBuySpy qui était supposé utiliser Sql CE 3.5, mais je ne peux pas réellement naviguer dans le labyrinthe de téléchargements msdn pour y accéder. Idéalement, je souhaite configurer un déploiement privé pour CE 4.0. 

Je suis tout ouïe. Suggestions, points, tout ce qui serait très apprécié. Je vous remercie!

OUI I DID VOIR LE KB. IL N'A PAS AIDÉ

Voir ici: http://support.Microsoft.com/kb/974247

RÉSULTATS DE CORFLAG

Ok, j'ai essayé et voici mes résultats: C:\Development\Mvc2MessingAround\Mvc2MessingAround\bin\Lib> corflags System.Data. SqlServerCe.dll Microsoft (R) Outil de conversion .NET Framework CorFlags. Version 3.5.21022.8 Droits d'auteur (c) Microsoft Corporation. Tous les droits sont réservés.

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

J'aurais juré avoir installé la version x86 des deux versions de Sql CE (3.5/4). Le programme d’installation est peut-être devenu un peu confus, car mon processeur est compatible 64 bits, mais j’utilise Windows xp sp 3 32 bits. Les résultats semblent indiquer que c'est 64 bits. Est-ce le cas?

DÉTAILS AJOUTÉS

À ce jour, les configurations ci-dessous ont été essayées sur 2 machines. Les deux sont Windows XP sp3 32 bits avec un processeur compatible 64 bits. L'environnement de développement sur les deux est VS 2008 Pro. Les résultats sur la machine 2 viennent après une nouvelle installation du Sql CE 4 Ctp.

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

Erreur:

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.

Code: 

SqlCeConnection conn = new SqlCeConnection();

CONFIGURATION 2

Identique à n ° 1, mais avec System.Data.SqlServerCE.Entity.dll dans la direction myapp\bin.

Les erreurs de page avant de frapper le code ci-dessus. C'est le message:

Impossible de charger le fichier ou l'assembly 'System.Data.SqlServerCe.Entity' ou l'une de ses dépendances. Cet assemblage est construit par un moteur d'exécution plus récent que le moteur d'exécution actuellement chargé et ne peut pas être chargé.

Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 

Détails des exceptions: System.BadImageFormatException: Impossible de charger le fichier ou l'assembly 'System.Data.SqlServerCe.Entity' ou l'une de ses dépendances. Cet assemblage est construit par un moteur d'exécution plus récent que le moteur d'exécution actuellement chargé et ne peut pas être chargé.

J'ai vérifié les paramètres du projet dans VS 2008 Pro et le framework .Net 3.5 est défini comme cible.

CONFIGURATION 3

Identique à # 1, sauf que System.Data.SqlServerCE.dll est référencé à partir du dossier myapp\bin\private.

Les résultats sont identiques à ceux de CONFIGURATION N ° 1 (le message d'erreur est identique à 100% et l'erreur se produit sur la même ligne de code).

CONFIGURATION CORRECTE

D'après les instructions d'Erik (si je les avais suivies plus attentivement), la configuration devrait être

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

Référencez le System.Data.SqlServerCE.dll directement à partir du dossier bin pour le code. Ma folie pensait que le dossier privé devait être inclus, mais ce n'est pas le cas. Ne placez pas le System.Data.SqlServerCE.Entity.dll dans le dossier bin sauf si vous utilisez une solution .net 4.0. Je ne pense pas que dll fonctionne w/3.5. 

Lien utile:

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

22
jason

SQL CE 3.5 ne fonctionne pas avec ASP.NET, vous devez utiliser 4.0 CTP.

Télécharger de ici .

Installez le runtime.

Copiez le contenu du répertoire suivant (y compris les dossiers x86 et AMD64) dans le dossier bin de votre application ASP.NET: C:\Program Files\Microsoft Édition compacte SQL Server\v4.0\Private

UPDATE: utilisez System.Data.SqlServerCe.dll à partir du dossier du bureau pour éviter les problèmes de confiance moyenne

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 

Ajoutez une référence au fichier System.Data.SqlServerCe.dll que vous venez de placer dans votre dossier/bin.

Placez le fichier sdf SQL Compact dans votre dossier App_Data.

Ajouter une chaîne de connexion:

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

Relier! :-)

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()));
            }
        }
    }
31
ErikEJ

Si vous utilisez une chaîne de connexion qui utilise un providerName et que vous n'avez pas installé le SDK, vous devez également l'ajouter à votre web.config (ou 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>

NOTE: le "remove" est nécessaire si vous avez installé le SDK, car cela mettra ces informations dans votre machine.config

13
Eric Labashosky

OK, voici une hypothèse, puisque vous les pêchez. 

Exécutez corflags.exe sur l’ensemble que vous avez copié dans votre répertoire de références. Quel type de machine construisez-vous? Si vous êtes sur un ordinateur 64 bits et que vous compilez au format x64 ou anyCpu, assurez-vous que les corflags vous indiquent que vos références ne sont pas uniquement des références 32 bits. Peut-être que c'est "retomber" sur une mauvaise version de votre GAC ou quelque chose du genre. S'il vous indique que l'Assemblée référencée est en 32 bits uniquement, compilez votre projet en tant que projet 32 ​​bits ou recherchez une version 64 bits de la DLL?

2
Dave Markle

Si vous installez le fournisseur SQL CE à l'aide de NuGet, la solution la plus simple consiste à ajouter une étape de post-génération pour les copier à partir du dossier NativeBinaries du package NuGet.

1
Dale Anderson

La clé pour moi était de réaliser que la version de System.Data.SqlServerCe.Entity.dll dans le répertoire privé (C:\Program Files\Microsoft Édition compacte SQL Server\v4.0\Private) est 4.0.0.1, où la version sous le répertoire du bureau (version C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.Entity) correspond à 4.0.0.0. La version de System.Data.SqlServerCe.dll dans le répertoire privé est 4.0.0.0.

Je pense que c'était une erreur de la part de Microsoft de distribuer un SqlServerCe.Entity.dll mis à jour sans une mise à jour correspondante vers SqlServer.dll.

0
Mark McClelland