正在使用的SQL Server版本不支持数据类型datetime2?

时间:2022-09-15 19:43:12
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

I have a website using Entity Framework. A few months ago I added a new table, and added some columns to existing tables; everything worked fine.

我有一个使用Entity Framework的网站。几个月前,我添加了一个新表,并在现有表中添加了一些列;一切正常。

Today I updated the mapping of the EDMX so the new table and the new column can be used, and added WebMethods to my services.asmx file. Since then I cannot run my site because I have that error that I cannot understand. Please explain it to me if you understand, and tell me where is my mistake.

今天我更新了EDMX的映射,以便可以使用新表和新列,并将WebMethods添加到我的services.asmx文件中。从那时起,我无法运行我的网站,因为我有一个我无法理解的错误。如果你明白了,请告诉我,并告诉我我的错误在哪里。

I have not used datetime2 anywhere. There is no such datatype in my new table, nor in the columns that I added to existing tables.

我没有在任何地方使用datetime2。我的新表中没有这样的数据类型,也没有添加到现有表的列中。

The version of SQL on my PC is SQL2008 R2, on the server i have SQL2008. I do not have the option to upgrade the server to R2.

我的PC上的SQL版本是SQL2008 R2,在我有SQL2008的服务器上。我没有选择将服务器升级到R2。

5 个解决方案

#1


18  

In addition to @Mithrandir answer validate that your database is running in compatibility level set to 100 (SQL 2008).

除了@Mithrandir之外,还要验证您的数据库是否在兼容级别设置为100的情况下运行(SQL 2008)。

You don't have to use DATETIME2 in your database to get this error. This error happens usually once you add required (NOT NULL) DATETIME column to existing table and you don't set the value prior to saving the entity to database. In such case .NET will send default value which is 1.1.0001 and this value doesn't fit into DATETIME range. This (or something similar) will be source of your problem.

您不必在数据库中使用DATETIME2来获取此错误。一旦将必需(NOT NULL)DATETIME列添加到现有表并且在将实体保存到数据库之前未设置该值,通常会发生此错误。在这种情况下,.NET将发送默认值1.1.0001,该值不适合DATETIME范围。这(或类似的东西)将成为您问题的根源。

#2


77  

Have you tried to open your EDMX file with XML Editor and check the value of ProviderManifestToken. It may help to change from ProviderManifestToken=”2008” to ProviderManifestToken=”2005”.

您是否尝试使用XML Editor打开EDMX文件并检查ProviderManifestToken的值。从ProviderManifestToken =“2008”更改为ProviderManifestToken =“2005”可能会有所帮助。

#3


12  

Open your EDMX in a file editor (or “open with…” in Visual Studio and select XML Editor). At the top you will find the storage model and it has an attribute ProviderManifestToken. This has should have the value 2008. Change that to 2005, recompile and everything works.

在文件编辑器中打开EDMX(或在Visual Studio中“用...打开”并选择XML编辑器)。在顶部,您将找到存储模型,它具有属性ProviderManifestToken。这应该具有值2008.将其更改为2005,重新编译,一切正常。

NOTE: You'll have to do this every time you update the model from database.

注意:每次从数据库更新模型时都必须执行此操作。

#4


3  

The other solutions worked for me but I needed a more permanent solution that would not be reverted every time the edmx was updated from the database. So I created a "Pre-build event" to modify the ProviderManifestToken automatically.

其他解决方案对我有用,但我需要一个更永久的解决方案,每次从数据库更新edmx时都不会恢复。所以我创建了一个“预构建事件”来自动修改ProviderManifestToken。

Link to original answer: https://*.com/a/8764394/810850

链接到原始答案:https://*.com/a/8764394/810850

The prebuild step looks like this:

预建步骤如下所示:

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

The code is here:

代码在这里:

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

#5


0  

Code First workaround.

I got this error while running a linq select query, and changing the EDMX isn't an option for me (Code First has no EDMX), and I didn't want to implement this How to configure ProviderManifestToken for EF Code First for a Linqpad query that wasn't going into production code:

运行linq select查询时出现此错误,更改EDMX对我来说不是一个选项(Code First没有EDMX),我不想实现这个如何为Linqpad配置EF Code First的ProviderManifestToken没有进入生产代码的查询:

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

I fixed it by changing query to null check first:

我通过将查询更改为null检查来修复它:

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

#1


18  

In addition to @Mithrandir answer validate that your database is running in compatibility level set to 100 (SQL 2008).

除了@Mithrandir之外,还要验证您的数据库是否在兼容级别设置为100的情况下运行(SQL 2008)。

You don't have to use DATETIME2 in your database to get this error. This error happens usually once you add required (NOT NULL) DATETIME column to existing table and you don't set the value prior to saving the entity to database. In such case .NET will send default value which is 1.1.0001 and this value doesn't fit into DATETIME range. This (or something similar) will be source of your problem.

您不必在数据库中使用DATETIME2来获取此错误。一旦将必需(NOT NULL)DATETIME列添加到现有表并且在将实体保存到数据库之前未设置该值,通常会发生此错误。在这种情况下,.NET将发送默认值1.1.0001,该值不适合DATETIME范围。这(或类似的东西)将成为您问题的根源。

#2


77  

Have you tried to open your EDMX file with XML Editor and check the value of ProviderManifestToken. It may help to change from ProviderManifestToken=”2008” to ProviderManifestToken=”2005”.

您是否尝试使用XML Editor打开EDMX文件并检查ProviderManifestToken的值。从ProviderManifestToken =“2008”更改为ProviderManifestToken =“2005”可能会有所帮助。

#3


12  

Open your EDMX in a file editor (or “open with…” in Visual Studio and select XML Editor). At the top you will find the storage model and it has an attribute ProviderManifestToken. This has should have the value 2008. Change that to 2005, recompile and everything works.

在文件编辑器中打开EDMX(或在Visual Studio中“用...打开”并选择XML编辑器)。在顶部,您将找到存储模型,它具有属性ProviderManifestToken。这应该具有值2008.将其更改为2005,重新编译,一切正常。

NOTE: You'll have to do this every time you update the model from database.

注意:每次从数据库更新模型时都必须执行此操作。

#4


3  

The other solutions worked for me but I needed a more permanent solution that would not be reverted every time the edmx was updated from the database. So I created a "Pre-build event" to modify the ProviderManifestToken automatically.

其他解决方案对我有用,但我需要一个更永久的解决方案,每次从数据库更新edmx时都不会恢复。所以我创建了一个“预构建事件”来自动修改ProviderManifestToken。

Link to original answer: https://*.com/a/8764394/810850

链接到原始答案:https://*.com/a/8764394/810850

The prebuild step looks like this:

预建步骤如下所示:

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

The code is here:

代码在这里:

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

#5


0  

Code First workaround.

I got this error while running a linq select query, and changing the EDMX isn't an option for me (Code First has no EDMX), and I didn't want to implement this How to configure ProviderManifestToken for EF Code First for a Linqpad query that wasn't going into production code:

运行linq select查询时出现此错误,更改EDMX对我来说不是一个选项(Code First没有EDMX),我不想实现这个如何为Linqpad配置EF Code First的ProviderManifestToken没有进入生产代码的查询:

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

I fixed it by changing query to null check first:

我通过将查询更改为null检查来修复它:

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