2013-04-30 63 views
11

轉換我有一個控制器:一個DATETIME2數據類型爲日期時間數據類型錯誤

[HttpPost] 
public ActionResult Create(Auction auction) 
{ 
    var db = new EbuyDataContext(); 
    db.Auctions.Add(auction); 
    db.SaveChanges(); 
    return View(auction); 
} 

模型:

public class Auction 
{ 
     public long Id { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public decimal StartPrice { get; set; } 
     public decimal CurrentPrice { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; }} 
} 

和一個視圖:

@model Ebuy.Website.Models.Auction 
@using (Html.BeginForm()) 
{ 
    <p> 
     //All the information fields... 
     @Html.LabelFor(model => model.EndTime) 
     @Html.EditorFor(model => model.EndTime) 
    </p> 
} 

當我嘗試運行它我收到錯誤:

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.

模型控制器視圖來自一對一複製的書。

什麼是我需要輸入到EndTime字段的格式,所以我不會有這個錯誤?

+0

您是否檢查過爲StartTime和EndTime保存的值?你可以在模型中看到 – 2013-04-30 11:25:52

回答

20

錯誤是因爲您沒有正確設置這些值,請確保根據您的應用程序語言環境設置它們。 (例如,對於en-GB,dd/mm/yyyy,對於en-US,mm/dd/yyyy)。

它也像你的數據庫已被設置爲使用datetime2列,一個datetime列。

您可以:

A)修改數據庫從datetime2的類型更改爲datetime

B)更改模型的類型是datetime2,這樣做:

[Column(TypeName = "DateTime2")] 
public DateTime StartTime { get; set; } 

[Column(TypeName = "DateTime2")] 
public DateTime EndTime { get; set; } 
+0

如何修改數據庫設置? – 2013-04-30 11:51:56

+0

@AlexandraOrlov如果您的數據庫首先是代碼,那麼應用這些屬性並重新生成數據庫應該沒問題。 – mattytommo 2013-04-30 11:52:55

+0

我改變了我的模型中的類型,並使用dd/mm/yyyy版本。我仍然不知道我應該如何修改數據庫設置,但感謝您的答案 – 2013-04-30 11:58:44

2

具有datetime2數據類型的列是否接受空值。如果不是,那麼當你不給這些列賦值的時候你可能會得到這個錯誤。

默認情況下,如果您的模型不使用可爲空的屬性,CodeFirst將創建不可爲空的列。嘗試將這些屬性轉換爲可空的日期時間。

+0

,我沒有任何限制。什麼是datatime2列? – 2013-04-30 11:38:12

+0

它是在數據庫級別具有datetime2數據類型的列。對不起,輸入錯誤。您的數據庫級別列是否接受空值? – 2013-04-30 11:43:37

+0

嗯......我不確定。正如我現在從書中學到的,我嘗試了「代碼優先」版本,創建了一個模型:public class EbuyDataContext:DbContext { public DbSet Auctions {get;組; } ... – 2013-04-30 11:46:27

0

我也遇到了這個問題。

一個DATETIME2數據類型爲datetime數據類型的轉換導致外的範圍內的值是一個接收非常不有用的錯誤。

要解決我不得不做以下(使用上面的例子)的問題:

一個可以找到包管理器控制檯 - >工具 - >庫包管理器 - >程序包管理器控制檯

我啓用了數據庫遷移的軟件包管理器控制檯 - >啓用的遷移

然後加入控制器類下面的代碼:

public class Auction 
{ 
public long Id { get; set; } 
public string Title { get; set; } 
public string Description { get; set; } 
public decimal StartPrice { get; set; } 
public decimal CurrentPrice { get; set; } 

// My Edit to the code Start --> 
public Nullable<DateTime> StartTime { get; set; } 
public Nullable<DateTime> EndTime { get; set; }} 
// My Edit to the code Finish <-- 
} 

然後在模型類:

[HttpPost] 

// My Edit to the code Start --> 
[DataType(DataType.Date)] 
[DisplayFormat(ApplyFormatInEditMode=true, DataFormatString = "{0:d}")]] 
// My Edit to the code Finish <-- 

public ActionResult Create(Auction auction) 
{ 

// My Edit to the code Start --> 
if(ModelState.IsValid) 
{ 
// Only Apply the DateTime if the Action is Valid... 
auction.StartTime = DateTime.Now; 
} 
// My Edit to the code Finish <-- 

var db = new EbuyDataContext(); 
db.Auctions.Add(auction); 
db.SaveChanges(); 
return View(auction); 
} 

然後添加到數據庫中的包管理器控制檯修改 - >添加遷移(您更改放在這裏)

然後運行程序包管理器數據庫更新控制檯 - >更新,數據庫

它的重要地看到,數據的數據庫看到的是正確的在上面執行:

E.G: 17/06/2013 12:00:00 AM 

這個錯誤是一個非常愚蠢的錯誤,但它似乎已經吸引了很多人,包括我的自我。現在我知道爲什麼會出現這種錯誤,似乎很容易修復和解決,但爲什麼這樣的常見問題不會在MVC的最新版本中得到修復,這是我無法理解的。

0

當我試圖將change_date添加到服務層中的聯繫人實體時,我收到了類似的錯誤。該問題已通過添加來自控制器的參數解決。請嘗試從Controller中添加參數。

12

當我嘗試使用EntityFramework將未升級的DateTime成員保存到數據庫時,我遇到了同樣的問題。 我在這裏閱讀答案,並且我知道可以通過聲明該成員爲空來解決它。我試了一下,它的工作! 所以這裏是一個代碼卡,對於那些誰需要它:

public Nullable<DateTime> MyDateTime { get; set; } 

public DateTime? MyDateTime { get; set; } 

後來我可以用它像波紋管:

if(MyDateTime.HasValue) 
{ 
    DoBlaBla(MyDateTime.Value); 
} 

或只是分配一個值它就像什麼都沒有發生......

MyDateTime = DateTime.Now; 
+0

這對我來說是訣竅,因爲我爲我的IdentityUser模型添加了出生日期字段 – Mikeware 2014-01-29 19:48:19

0

我在數據庫的DateCreated上有一個默認的getdate()值。我沒有在EF中設定價值,因爲我認爲我不需要。一旦我通過EF插入值,錯誤就消失了。爲什麼首先出現這種錯誤?我從來沒有想過這一點。

0

我建議使DateTime屬性爲空並且還使用屬性驗證來確保該值在可接受的範圍內。

我創建了一個從RangeAttribute繼承的自定義屬性來驗證日期值。

public class DbDateRangeAttribute 
    : RangeAttribute 
{ 
    public DbDateRangeAttribute() 
     : base(typeof(DateTime), SqlDateTime.MinValue.Value.ToShortDateString(), SqlDateTime.MaxValue.Value.ToShortDateString()) 
    { } 
} 

然後你使用這樣的

[DbDateRange] 
public DateTime? StartTime { get; set; } 

一樣的屬性,如果用戶輸入SQLDATETIME(可能是因爲客戶端的日期選擇問題),範圍之外的值,他會得到像下面這樣一個有意義的錯誤消息:

The field StartTime must be between 1/1/1753 12:00:00 AM and 12/31/9999 12:00:00 AM.

0

我就遇到了這個與我的系統領域(created_on,modified_on),即使我的模型正確定義。

我的問題的原因是使用禁用屬性與只讀。表單不會將禁用的輸入值提交給控制器,導致產生空值,從而導致最小日期/時間值。

錯誤:

<div class="form-group"> 
    @Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" }) 
    <div class="col-lg-9"> 
     @Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", disabled="disabled" } }) 
     @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" }) 
    </div> 
</div> 

右:

<div class="form-group"> 
    @Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" }) 
    <div class="col-lg-9"> 
     @Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } }) 
     @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" }) 
    </div> 
</div> 
相關問題