web-dev-qa-db-fra.com

La version de SQL Server utilisée ne prend pas en charge le type de données datetime2?

An error occurred while executing the command definition. See the inner exception for details. bbbbInnerException:aaaa System.ArgumentException: The version of SQL Server in use does not support datatype 'datetime2'.

   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)

   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)

   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)

   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)

   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)

   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)

   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)

   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavioR

J'ai un site web utilisant Entity Framework. Il y a quelques mois, j'ai ajouté un nouveau tableau et quelques colonnes aux tableaux existants. tout a bien fonctionné.

Aujourd'hui, j'ai mis à jour le mappage de l'EDMX afin que la nouvelle table et la nouvelle colonne puissent être utilisées, et ajouté WebMethods à mon fichier services.asmx. Depuis lors, je ne peux pas exécuter mon site car j'ai cette erreur que je ne peux pas comprendre. S'il vous plaît, expliquez-moi si vous comprenez et dites-moi où est ma faute.

Je n'ai pas utilisé datetime2 nulle part. Ce type de données n'existe pas dans ma nouvelle table, ni dans les colonnes que j'ai ajoutées aux tables existantes.

La version de SQL sur mon PC est SQL2008 R2, sur le serveur, j'ai SQL2008. Je n'ai pas la possibilité de mettre à niveau le serveur vers R2.

25
Barbara88

En plus de @Mithrandir answer, vérifiez que votre base de données est en cours d'exécution avec un niveau de compatibilité défini sur 100 (SQL 2008).

Il n'est pas nécessaire d'utiliser DATETIME2 dans votre base de données pour obtenir cette erreur. Cette erreur se produit généralement une fois que vous avez ajouté la colonne requise (NOT NULL) DATETIME à la table existante et que vous ne définissez pas la valeur avant d'enregistrer l'entité dans la base de données. Dans ce cas, .NET enverra la valeur par défaut qui est 1.1.0001 et cette valeur ne rentre pas dans la plage DATETIME. Ceci (ou quelque chose de similaire) sera la source de votre problème.

18
Ladislav Mrnka

Avez-vous essayé d'ouvrir votre fichier EDMX avec XML Editor et vérifiez la valeur de ProviderManifestToken. Il peut être utile de passer de ProviderManifestToken=”2008” à ProviderManifestToken=”2005”

78
Mithrandir

Ouvrez votre EDMX dans un éditeur de fichier (ou «ouvrez avec…» dans Visual Studio et sélectionnez Éditeur XML). En haut, vous trouverez le modèle de stockage et son attribut ProviderManifestToken. Cela devrait avoir la valeur 2008. Changez-le en 2005, recompilez et tout fonctionne.

REMARQUE: vous devrez le faire chaque fois que vous mettrez à jour le modèle à partir de la base de données.

12
Maher Ben Issa

Les autres solutions fonctionnaient pour moi, mais il me fallait une solution plus permanente qui ne serait pas rétablie à chaque mise à jour d’edmx à partir de la base de données. J'ai donc créé un "événement de pré-génération" pour modifier le ProviderManifestToken automatiquement. 

Lien vers la réponse originale: https://stackoverflow.com/a/8764394/810850

L'étape de pré-construction ressemble à ceci:

$(SolutionDir)Artifacts\SetEdmxVer\SetEdmxSqlVersion $(ProjectDir)MyModel.edmx 2005

Le code est ici:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace SetEdmxSqlVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            if (2 != args.Length)
            {
                Console.WriteLine("usage: SetEdmxSqlVersion <edmxFile> <sqlVer>");
                return;
            }
            string edmxFilename = args[0];
            string ver = args[1];
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(edmxFilename);

            XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
            mgr.AddNamespace("edmx", "http://schemas.Microsoft.com/ado/2008/10/edmx");
            mgr.AddNamespace("ssdl", "http://schemas.Microsoft.com/ado/2009/02/edm/ssdl");
            XmlNode node = xmlDoc.DocumentElement.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema", mgr);
            if (node == null)
            {
                Console.WriteLine("Could not find Schema node");
            }
            else
            {
                Console.WriteLine("Setting EDMX version to {0} in file {1}", ver, edmxFilename);
                node.Attributes["ProviderManifestToken"].Value = ver;
                xmlDoc.Save(edmxFilename);
            }
        }
    }
}
3
Ben Anderson

Solution de contournement Code First.

J'ai eu cette erreur lors de l'exécution d'une requête linq select et la modification de l'EDMX n'est pas une option pour moi (Code First n'a pas d'EDMX), et je ne voulais pas implémenter cette Comment configurer ProviderManifestToken pour EF Code First pour une requête Linqpad qui n'entrait pas dans le code de production:

// [dbo].[People].[Birthday] is nullable

DateTime minBirthday = DateTime.Now.AddYears(-18);

var query =
    from c in context.People
    where c.Birthday > birthday
    select c;

var adults = query.ToList();

Je l'ai corrigé en changeant query en null check en premier: 

var query =
    from c in context.People
    where (c.Birthday.HasValue && (c.Birthday > birthDay) )
    select c;
1
Walter Stabosz