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 

Tôi có một trang web sử dụng Khung thực thể. Một vài tháng trước, tôi đã thêm một bảng mới và thêm một số cột vào các bảng hiện có; mọi thứ đều ổn.Phiên bản SQL Server đang sử dụng không hỗ trợ datatype datetime2?

Hôm nay tôi cập nhật ánh xạ của EDMX để bảng mới và cột mới có thể được sử dụng và thêm WebMethods vào tệp services.asmx của tôi. Kể từ đó tôi không thể chạy trang web của tôi bởi vì tôi có lỗi mà tôi không thể hiểu được. Hãy giải thích cho tôi nếu bạn hiểu, và cho tôi biết đâu là sai lầm của tôi.

Tôi chưa sử dụng datetime2 ở bất kỳ đâu. Không có kiểu dữ liệu như vậy trong bảng mới của tôi, cũng như trong các cột mà tôi đã thêm vào các bảng hiện có.

Phiên bản SQL trên máy tính của tôi là SQL2008 R2, trên máy chủ tôi có SQL2008. Tôi không có tùy chọn nâng cấp máy chủ lên R2.

+0

bạn đang sử dụng một thủ tục CLR? – Milee

+0

[Datetime2] (http://msdn.microsoft.com/en-us/library/bb677335%28v=sql.100%29.aspx) đã tồn tại trong SQL 2008 anyway, vì vậy tôi nghĩ rằng việc nâng cấp lên R2 trên máy chủ sẽ 't giúp bạn anyway. – Bridge

+0

Hãy xem xét mức độ tương thích của cơ sở dữ liệu của bạn (thuộc tính-> tùy chọn), là nó cũng SQL Server 2008? – Wim

Trả lời

18

Ngoài câu trả lời @Mithrandir xác thực rằng cơ sở dữ liệu của bạn đang chạy ở mức tương thích được đặt thành 100 (SQL 2008).

Bạn không phải sử dụng DATETIME2 trong cơ sở dữ liệu để nhận lỗi này. Lỗi này xảy ra thường khi bạn thêm yêu cầu (NOT NULL) DATETIME cột vào bảng hiện tại và bạn không đặt giá trị trước khi lưu thực thể vào cơ sở dữ liệu. Trong trường hợp này .NET sẽ gửi giá trị mặc định là 1.1.0001 và giá trị này không khớp với phạm vi DATETIME. Điều này (hoặc một cái gì đó tương tự) sẽ là nguồn gốc của vấn đề của bạn.

+0

Tôi đã kiểm tra mức độ tương thích của mình, đó là 90 (2005). và cũng đã kiểm tra kịch bản của tôi, nó cho phép null trên trường datetime. Nhưng vẫn nhận được thông báo lỗi này. Btw, tôi đang sử dụng SQL Server 2012 – Franva

76

Bạn đã cố gắng mở tệp EDMX bằng Trình chỉnh sửa XML và kiểm tra giá trị ProviderManifestToken. Nó có thể giúp thay đổi từ ProviderManifestToken=”2008” thành ProviderManifestToken=”2005”.

+3

Làm việc hoàn hảo cho tôi. Trong khi câu trả lời ở trên đưa ra lý do, câu trả lời này đưa ra một sửa chữa nhanh. – aokelly

+2

Điều này hiệu quả - và nhanh chóng, tôi yêu bạn. –

+0

Điều này làm việc cho tôi –

12

Mở EDMX của bạn trong trình chỉnh sửa tệp (hoặc “mở bằng…” trong Visual Studio và chọn Trình chỉnh sửa XML). Ở phía trên, bạn sẽ tìm thấy mô hình lưu trữ và nó có một thuộc tính ProviderManifestToken. Điều này cần phải có giá trị 2008. Thay đổi đó đến năm 2005, biên dịch lại và tất cả mọi thứ hoạt động.

LƯU Ý: Bạn sẽ phải thực hiện việc này mỗi khi bạn cập nhật mô hình từ cơ sở dữ liệu.

3

Các giải pháp khác làm việc cho tôi nhưng tôi cần một giải pháp lâu dài hơn sẽ không được hoàn nguyên mỗi khi bản cập nhật được cập nhật từ cơ sở dữ liệu. Vì vậy, tôi đã tạo một "sự kiện dựng sẵn" để tự động sửa đổi ProviderManifestToken.

Liên kết với câu trả lời ban đầu: https://stackoverflow.com/a/8764394/810850

Bước prebuild trông như thế này:

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

Mã này là ở đây:

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

Điều đó tương tự như cách tôi tự động hóa nó. Chỉ có sự khác biệt là tôi đã viết một công cụ để phân tích cú pháp và đặt bất kỳ thẻ xml/thuộc tính nào, thay vì một thẻ cụ thể. Có nhiều công dụng hơn cho xây dựng tự động ... –

0

Mã Đầu tiên workaround.

Tôi gặp lỗi này khi chạy truy vấn chọn LINQ và thay đổi EDMX không phải là tùy chọn cho tôi (Mã đầu tiên không có EDMX) và tôi không muốn triển khai How to configure ProviderManifestToken for EF Code First cho truy vấn Linqpad này 't đi vào mã sản xuất:

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

tôi cố định nó bằng cách thay đổi query null kiểm tra đầu tiên:

var query = 
    from c in context.People 
    where (c.Birthday.HasValue && (c.Birthday > birthDay)) 
    select c; 
Các vấn đề liên quan