none
LINQ的修改如何送NULL值進資料庫? RRS feed

  • 問題

  • 我是用VS2008SP1中的LINQ to Entity Framework,資料庫是SQLServer2008

    TABLE dbo.users大致如下

    PKID int, UserName nvarchar(20), LastLoginTime datetime2(7)

    系統中LastLoginTime是記載最後登入時間,如果此欄位值為NULL,則代表從來沒有登入過系統

    現在我要寫的消除最後登入時間的功能,如下(嘗試取出會員編號1的人並且修改最後登入時間)

    var tb1=From u in DBEntity.Users Where u.PKID=1 Select u.UserName,u.LastLoginTime;

    var tb1fix=tb1.First();

    tb1.LastLoginTime=null;

    DBEntity.SaveChanges();

    可是跳出錯誤訊息:可為NULL的物件必須具有值。

    我換成正常的DateTime格式就可以順利修改資料

    嘗試過ADO.NET的作法:DBNull.Value,但是也不行

    請問使用LINQ應該如何把NULL值寫進資料庫內呢?

    2010年12月14日 上午 09:01

解答

  • 確定是在Update的時候出錯的嗎?

    我這邊跑都挺正常的。

    • 已標示為解答 小小郭 2010年12月14日 上午 09:59
    2010年12月14日 上午 09:48
  • LastLoginTime.GetValueOrDefault().ToString("yyyy/MM/dd")用於此會有問題
    因為你的LastLoginTime型別為DataTime?型別,所以GetValueOrDefault()若無資料預設會傳回1/1/0001 12:00:00 AM.

    所以比較好的寫法是

    LastLoginTime.HasValue ? LastLoginTime.Value : "";

    • 已標示為解答 小小郭 2010年12月15日 上午 01:34
    2010年12月15日 上午 12:20

所有回覆

  • 變數用錯嗎?

    tb1fix.LastLoginTime = null;

    2010年12月14日 上午 09:14
  • 變數用錯嗎?

    tb1fix.LastLoginTime = null;


    sorry,是筆誤..

    實際上我換成

    tb1fix.LastLoginTime = new Datetime(1999,01,01);

    就可以正常執行

    然後改回

    tb1fix.LastLoginTime = null;

    錯誤訊息:可為NULL的物件必須具有值。

    2010年12月14日 上午 09:35
  • 確定是在Update的時候出錯的嗎?

    我這邊跑都挺正常的。

    • 已標示為解答 小小郭 2010年12月14日 上午 09:59
    2010年12月14日 上午 09:48
  • 原來錯誤的是下一行...

    在LINQ裡面

    如果取出來是NULL

    但是把他轉成日期格式.ToString("yyyy/MM/dd")

    就會發生這個錯誤

    目前解法 LastLoginTime.GetValueOrDefault().ToString("yyyy/MM/dd")

    2010年12月14日 上午 10:10
  • LastLoginTime.GetValueOrDefault().ToString("yyyy/MM/dd")用於此會有問題
    因為你的LastLoginTime型別為DataTime?型別,所以GetValueOrDefault()若無資料預設會傳回1/1/0001 12:00:00 AM.

    所以比較好的寫法是

    LastLoginTime.HasValue ? LastLoginTime.Value : "";

    • 已標示為解答 小小郭 2010年12月15日 上午 01:34
    2010年12月15日 上午 12:20