25
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 

Tengo un sitio web que utiliza Entity Framework. Hace unos meses, agregué una nueva tabla y agregué algunas columnas a las tablas existentes; todo funcionó bienLa versión de SQL Server en uso no admite el tipo de datos datetime2?

Hoy actualicé la asignación del EDMX para que se puedan usar la nueva tabla y la nueva columna, y agregué WebMethods a mi archivo services.asmx. Desde entonces no puedo ejecutar mi sitio porque tengo ese error que no puedo entender. Por favor explícamelo si entiendes, y dime dónde está mi error.

No he usado datetime2 en cualquier lugar. No hay tal tipo de datos en mi nueva tabla, ni en las columnas que agregué a las tablas existentes.

La versión de SQL en mi PC es SQL2008 R2, en el servidor tengo SQL2008. No tengo la opción de actualizar el servidor a R2.

+0

¿Está utilizando un procedimiento CLR? – Milee

+0

[Datetime2] (http://msdn.microsoft.com/en-us/library/bb677335%28v=sql.100%29.aspx) existía en SQL 2008 de todos modos, por lo que creo que la actualización a R2 en el servidor wouldn No te ayudo de todos modos. – Bridge

+0

Eche un vistazo al nivel de compatibilidad de su base de datos (propiedades-> opciones), ¿es también SQL Server 2008? – Wim

Respuesta

18

Además de @Mithrandir responder validar que su base de datos se está ejecutando en el nivel de compatibilidad establecido en 100 (SQL 2008).

No necesita usar DATETIME2 en su base de datos para obtener este error. Este error ocurre generalmente una vez que agrega la columna requerida (NOT NULL) DATETIME a la tabla existente y no establece el valor antes de guardar la entidad en la base de datos. En tal caso, .NET enviará un valor predeterminado que es 1.1.0001 y este valor no se ajusta al rango DATETIME. Esto (o algo similar) será la fuente de su problema.

+0

Comprobé mi nivel de compatibilidad, es 90 (2005). y también verifiqué mi script, permite null en el campo de fecha y hora. Pero aún recibí este mensaje de error. Por cierto, estoy usando SQL Server 2012 – Franva

76

Ha intentado abrir su archivo EDMX con XML Editor y comprobar el valor de ProviderManifestToken. Puede ayudar cambiar de ProviderManifestToken=”2008” a ProviderManifestToken=”2005”.

+3

funcionó perfectamente para mí. Si bien la respuesta anterior da la razón, esta proporciona una solución rápida. – aokelly

+2

Esto funcionó muy bien, y rápidamente, te amo. –

+0

Esto funcionó para mí –

12

Abra su EDMX en un editor de archivos (o "abra con ..." en Visual Studio y seleccione Editor XML). En la parte superior encontrará el modelo de almacenamiento y tiene un atributo ProviderManifestToken. Esto debe tener el valor 2008. Cambie eso a 2005, recompile y todo funcione.

NOTA: Deberá hacer esto cada vez que actualice el modelo desde la base de datos.

3

Las otras soluciones funcionaron para mí, pero necesitaba una solución más permanente que no se revierte cada vez que se actualizó el edmx desde la base de datos. Así que creé un "evento de preconstrucción" para modificar el ProviderManifestToken automáticamente.

Enlace a la respuesta original: https://stackoverflow.com/a/8764394/810850

El paso prebuild se ve así:

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

El código está aquí:

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

Eso es similar a cómo lo automaticé también. La única diferencia es que escribí una herramienta para analizar y establecer cualquier etiqueta/atributo xml, en lugar de uno específico. Tiene más usos para compilaciones automáticas ... –

0

Código primera solución.

Recibí este error mientras ejecutaba una consulta de selección de linq, y cambiar el EDMX no es una opción para mí (Code First no tiene EDMX), y no quería implementar este How to configure ProviderManifestToken for EF Code First para una consulta de Linqpad que no 't entrar en el código de producción:

// [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(); 

me fijo cambiando query a nULL Registro primera:

var query = 
    from c in context.People 
    where (c.Birthday.HasValue && (c.Birthday > birthDay)) 
    select c; 
Cuestiones relacionadas