web-dev-qa-db-ja.com

使用中のSQL Serverのバージョンは、データ型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

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

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

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

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

26
Barbara88

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

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

18
Ladislav Mrnka

XMLエディターでEDMXファイルを開こうとして、ProviderManifestTokenの値を確認しましたか? ProviderManifestToken=”2008”からProviderManifestToken=”2005”への変更が役立つ場合があります。

80
Mithrandir

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

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

12
Maher Ben Issa

他の解決策もうまくいきましたが、edmxがデータベースから更新されるたびに元に戻らない、より永続的な解決策が必要でした。そこで、ProviderManifestTokenを自動的に変更する「事前構築イベント」を作成しました。

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

事前構築ステップは次のようになります。

$(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);
            }
        }
    }
}
3
Ben Anderson

コードファーストの回避策。

Linq selectクエリの実行中にこのエラーが発生し、EDMXを変更することは選択肢にありません(Code FirstにはEDMXがありません)。これを実装したくありません EFコード用にProviderManifestTokenを構成する方法)最初に は、製品コードに含まれていなかったLinqpadクエリの場合:

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

最初にqueryをnullチェックに変更して修正しました。

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