2011-02-01 2 views
0

문제점에 대한 약간의 배경 - 큰 C# MVC 응용 프로그램을 상속했으며 현재 응용 프로그램의 주 프로세스를 변경하고 있습니다.MVC 업데이트 오류 : datetime2

원래 사용자는 항목을 업로드 할 것입니다. 그러나 이제 사용자는 항목을 전달할 수 있도록 확인란을 선택할 수 있습니다. 이 확인란을 선택하면 배달 테이블에 관련 세부 정보가 채워집니다. 여기

는 사용자가 원래 항목의 세부 사항을 업로드 할 때 내 항목 컨트롤러에서 POST 작업입니다 :

 [HttpPost] 
     public ActionResult AddItemDetails(Int64? itemId, Item item, FormCollection formValues) 
     { 
      if (formValues["cancelButton"] != null) 
      { 
       return RedirectToAction("Index"); 
      } 

      if (formValues["backButton"] != null) 
      { 
       return RedirectToAction("AddItemStart"); 
      } 

      string ImageGuid = formValues["ImageGUID"]; 
      ViewData["Image_GUID"] = ImageGuid; 

      if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid)) 
      { 
       ModelState.AddModelError("Image", "Image is required."); 
       ViewData["Image"] = "Image is required."; 
      } 

      if (ModelState.IsValid) 
      { 
       item.SubmissionState = -1; // Unsubmitted; 

       /**********************ADDED 25/1/2011**************************/ 
       item.ProductCode = formValues["ProductCode"]; 
       item.Name = formValues["Name"]; 


       string deliverySelection = formValues["deliverySelection"]; 

       if (deliverySelection == "on") 
       { 
        item.DeliverySelection = "Yes"; 

        Delivery c = new Delivery() 
        { 
         ProductCode = formValues["ProductCode"], 
         Name = formValues["Name"], 
         PhoneNo = formValues["PhoneNo"], 
         Address = formValues["Address"], 
         SubmissionDate = System.DateTime.Now 
        }; 

        item.Delivery = c; 
       } 
       else 
       { 
        item.DeliverySelection = "No"; 
       } 

       /*****************************END*******************************/ 
       if (itemId.HasValue) 
       { 
        UpdateItemDetails(item, ImageGuid, this); 
       } 
       else 
       { 
        titleId = ItemServices.AddItem(item, ImageGuid); 
       } 

       return RedirectToAction("AddSubItemDetails", new { itemId = item.ItemID }); 
      } 

      return View(item); 
     } 

이 잘 작동하고 원하는 결과를 얻을 수있다. 그러나 항목 컨트롤러에서 업데이트 작업을 수정하는 데 조금 어려움이 있습니다. 이 약간 다릅니다과 UpdateItemDetails를 사용하는 방법

[HttpPost] 
public ActionResult UpdateItemDetails(Int64 itemId, Item item, FormCollection formValues) 
{ 
    if (formValues["cancelButton"] != null) 
    { 
     return RedirectToAction("View", new { itemId = itemId }); 
    } 

    string image = formValues["ImageGUID"]; 
    ViewData["Image_GUID"] = ImageGuid; 

    if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid)) 
    { 
     ModelState.AddModelError("Image", "Image is required."); 
    } 

    if (ModelState.IsValid) 
    { 
     //**********************Added 31.01.2011****************************// 
    using (ModelContainer ctn = new ModelContainer()) 
    { 
      string DeliverySelection = formValues["deliverySelection"]; 

      if (deliverySelection == "on") 
      { 
       item.DeliverySelection = "Yes"; 

       Delivery c = new Delivery() 
      { 
       ProductCode = formValues["ProductCode"], 
       Name = formValues["Name"], 
       PhoneNo = formValues["PhoneNo"], 
        Address = formValues["Address"], 
       SubmissionDate = System.DateTime.Now 
      }; 

        ctn.Delierys.AddObject(c); 

       item.Delivery = c; 

      } 
      else 
      { 
       item.DeliverySelection = "No"; 
      } 


     ctn.AddToItems(item); 
     ctn.SaveChanges(); 

     UpdateItemDetails(item, ImageGuid, this); 
     return RedirectToAction("View", new { itemId = itemId }); 
    } 

    return View("UpdateItemDetails", MasterPage, item); 
} 

공지 사항() 데이터베이스를 업데이트 : 여기에 지금까지 가지고있는 것입니다. 배달 데이터베이스에 삽입 할 formvalues를 수집해야하므로 여기서는 무엇을해야할지 확신이 들지 않았습니다. ,

private void UpdateItemDetails(Item item, string ImageFileGuid, ItemsController controller) 
    { 
     using (ModelContainer ctn = new ModelContainer()) 
     { 
      Item existingData = ItemServices.GetCurrentUserItem(item.ItemID, ctn); 
      controller.UpdateModel(existingData); 

      existingData.UpdatedBy = UserServices.GetCurrentUSer().UserID; 
      existingData.UpdatedDate = DateTime.Now; 

      // If there is a value in this field, then the user has opted to upload 
      // a new cover. 
      // 
      if (!String.IsNullOrEmpty(ImageFileGuid)) 
      { 
       // Create a new CoverImage object. 
       // 
       byte[] imageBytes = FileServices.GetBytesForFileGuid(Guid.Parse(ImageFileGuid)); 

       Image newImage = new Image() 
       { 
        OriginalCLOB = imageBytes, 
        ThumbnailCLOB = ImageServices.CreateThumbnailFromOriginal(imageBytes), 
        HeaderCLOB = ImageServices.CreateHeaderFromOriginal(imageBytes), 
        FileName = "CoverImage" 
       }; 

       existingData.Image = newImage; 
      } 

      ctn.SaveChanges(); 
     } 
    } 

코드로 위의 작업 나는 세부 사항을 업데이트하려고하면 다음과 같은 오류가 발생합니다 : 여기 UpdateItemDetails입니다

이 오류는 업데이트 작업에 ctn.SaveChanges()에서 발생합니다

System.Data.SqlClient.SqlException: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. The statement has been terminated.

.

그래서 내 첫 번째 질문은 AddItemDetails 동작에 영향을 미칠 변경하지 않고이 오류를 극복하는 방법입니다. 내 두 번째 질문은 그 오류가 해결 된 경우 올바른 방법으로 업데이트 할 수 있습니까?

나는 모든 포인터에 대해 매우 감사 할 것입니다. 더 많은 정보가 필요하면 그냥 물어보십시오.

감사합니다 :)

답변

4

나는 귀하의 오류를 조사하고 DATETIME 및 DATETIME2 데이터 형식에 대한 약간의 정보를 제공하는 또 다른 질문으로 this answer을 발견했습니다.

DATETIME supports 1753/1/1 to "eternity" (9999/12/31), while DATETIME2 support 0001/1/1 through eternity.

제출 된 데이터를 확인하면 이상한 점이 있습니까? DATETIME 필드에 대해 유효하지 않은 일부 기본값으로 설정되는 항목 클래스의 날짜 속성이 있습니까?

0

저장하고자하는 객체의 날짜 중 하나가 DateTime.MinValue 인 것 같습니다. 예를 들어 제출 날짜 일 수 있습니다. 양식 데이터를 검사하여 값이 클라이언트에서 올바르게 업데이트되고 있는지 확인하고 거기에서 이동하십시오.

0

누군가가 실수로 슬래시 (예 : 1/1/89를 의미)를 잊어 버리면 TryUpdateModel()이 모델을 오류없이 업데이트하여 .NET DateTime이 "1/1/0189 "입니다.

그러나 "datetime2 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어난 값이 반환됩니다"라는 저장 문제로 인해 충돌이 발생합니다.

이렇게 저장하기 전에 나는 이것을 잡을 수 있습니까?

+0

위의 링크 된 게시물에 "날짜의 연도를 확인하십시오 - 1753 이전 인 경우 1753 년 이후로 변경해야합니다."TryUpdateModel의 요점은 각 필드에 대한 유효성 검사를 하드 코딩 할 필요가 없다는 것입니다. 더 좋은 방법이 있어야합니다. –