27
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

Entity Framework を使用した Web サイトがあります。数か月前、新しいテーブルを追加し、いくつかの列を既存のテーブルに追加しました。すべてがうまくいきました。

今日、新しいテーブルと新しい列を使用できるように EDMX のマッピングを更新し、services.asmx ファイルに WebMethods を追加しました。それ以来、理解できないエラーがあるため、サイトを実行できません。理解できたら説明してください。どこが間違っているのか教えてください。

私はどこでもdatetime2を使用していません。新しいテーブルにも、既存のテーブルに追加した列にも、そのようなデータ型はありません。

私のPCのSQLのバージョンはSQL2008 R2で、サーバーにはSQL2008があります。サーバーを R2 にアップグレードするオプションがありません。

4

5 に答える 5

83
于 2012-04-19T09:18:21.137 に答える
19

@Mithrandir の回答に加えて、データベースが 100 (SQL 2008) に設定された互換性レベルで実行されていることを確認してください。

DATETIME2このエラーを取得するためにデータベースで使用する必要はありません。NOT NULLこのエラーは通常、必要な ( )列を既存のテーブルに追加DATETIMEし、エンティティをデータベースに保存する前に値を設定しなかった場合に発生します。このような場合、.NET はデフォルト値の 1.1.0001 を送信しますが、この値は範囲に収まりませんDATETIME。これ(または同様のもの)が問題の原因になります。

于 2012-04-19T09:47:03.460 に答える
12

ファイル エディターで EDMX を開きます (または、Visual Studio で [… で開く] を選択し、[XML エディター] を選択します)。上部にストレージ モデルがあり、属性 ProviderManifestToken があります。この値は 2008 である必要があります。それを 2005 に変更し、再コンパイルすると、すべてが機能します。

注: データベースからモデルを更新するたびに、これを行う必要があります。

于 2013-12-15T13:52:09.650 に答える
3

他のソリューションは私にとってはうまくいきましたが、edmx がデータベースから更新されるたびに元に戻されない、より永続的なソリューションが必要でした。そこで、ProviderManifestToken を自動的に変更する「ビルド前イベント」を作成しました。

元の回答へのリンク: https://stackoverflow.com/a/8764394/810850

ビルド前のステップは次のようになります。

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

コードは次のとおりです。

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);
            }
        }
    }
}
于 2014-03-24T16:09:23.970 に答える