ไม่สามารถอัปเดตเรกคอร์ดที่มีค่าวันที่เป็นโมฆะใน Telerik Open Access

ฉันมีวิธีแก้ปัญหาสำหรับโครงการ Telerik Data Access ฉันพบปัญหาขณะพยายามอัปเดตบันทึก ฉันคิดว่าปัญหาเกี่ยวข้องกับความจริงที่ว่ามันเป็นเขตข้อมูลวันที่ที่มีค่าว่างในฐานข้อมูลก่อนที่จะพยายามอัปเดต แต่ฉันไม่แน่ใจ ใครช่วยบอกฉันหน่อยว่าจะแก้ไขมันอย่างไร?

ในโครงการ MVC เรามีโมเดลที่เรียกว่า tblCoLocation มันเชื่อมโยงกับฐานข้อมูล SQL ของเรา โหมดนี้ถูกกำหนดไว้ในโครงการ Data Access เป็น

namespace Project.OpenAccess
{
public class tblCoLocation
 {
    public int LocID { get; set; }
    ...
    public DateTime ModOn { get; set; }
    public int ModBy { get; set; }
 }
}

หากต้องการอัปเดตข้อมูลในไฟล์ชื่อ Repository.cs ฉันมีวิธีนี้:

public void UpdateCoLocation(tblCoLocation obj)
    {
        var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);

        if (upd != null)
        {
          upd.ModOn = obj.ModOn;
          upd.ModBy = obj.ModBy;
        }

        dat.SaveChanges();
    }

ฉันมีรหัสที่คล้ายกันสำหรับการอัปเดตรุ่นอื่น ๆ แต่สำหรับ tblCoLocation มันเกิดข้อผิดพลาด ฟิลด์ ModOn เป็นโมฆะในฐานข้อมูล (นี่คือการออกแบบของลูกค้าของเรา null หมายความว่าบันทึกไม่ได้รับการแก้ไข และพวกเขาต้องการเก็บข้อมูลในลักษณะนั้น) เรากำลังพยายามตั้งค่า ModOn เป็นวันที่ปัจจุบัน และฉันได้ตรวจสอบแล้วว่าโมเดลนั้นมีค่าสำหรับ ModOn เมื่อเข้าถึงคำสั่ง SaveChanges() หากฉันใส่ค่าใน ModBy ในฐานข้อมูลด้วยตนเอง การอัปเดตจะทำงานตามที่คาดไว้ นี่คือเหตุผลที่ฉันคิดว่าการมี ModOn เป็นโมฆะในตอนแรกอาจเป็นปัญหาได้

ข้อผิดพลาดที่เกิดขึ้นเมื่อเข้าถึงส่วนนี้ (ฉันได้อ่านโค้ดแล้วและข้อผิดพลาดมาจาก dat.SaveChanges) คือ:

ผิดพลาดเซิร์ฟเวอร์ใน '/' แอพลิเคชัน. SqlDateTime ล้น จะต้องเป็นระหว่างวันที่ 1/1/2396 เวลา 00:00:00 น. ถึง 31/12/9999 เวลา 23:59:59 น.

รายละเอียดข้อยกเว้น: System.Data.SqlTypes.SqlTypeException: ล้น SqlDateTime จะต้องเป็นระหว่างวันที่ 1/1/2396 เวลา 00:00:00 น. ถึง 31/12/9999 เวลา 23:59:59 น.

[SqlTypeException: SqlDateTime ล้น ต้องอยู่ระหว่าง 1/1/1753 00:00:00 AM ถึง 31/1/9999 23:59:59 น.]

Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate (Nullable 1 commandTimeout) +785
OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate (Nullable`1 commandTimeout) +146
OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates (OID oid, ดัชนี Int32, ClassMetaData cmd, กราฟ PersistGraph, Int32 [] fieldNos, บูลีน haveNewObjects, CharBuf s, BatchControlInfo batControl, บูลีน PreviousInserts) +3385

[DataStoreException: การอัปเดตล้มเหลว: System.Data.SqlTypes.SqlTypeException: ล้น SqlDateTime จะต้องเป็นระหว่างวันที่ 1/1/2396 เวลา 00:00:00 น. ถึง 31/12/9999 เวลา 23:59:59 น. ที่ Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate (Nullable 1 commandTimeout) ที่ OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate (Nullable1 commandTimeout) ที่ OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates (OID oid, ดัชนี Int32, ClassMetaData cmd , กราฟ PersistGraph, Int32[] fieldNos, Boolean haveNewObjects, CharBuf s, BatchControlInfo battControl, Boolean PreviousInserts) แถว: GenericOID@91ae60ab tblCoLocation LocID=5 UPDATE [tblCoLocation] SET [Address2] = ?, [Country] = ?, [ModBy] = ?, [ดัดแปลง] = ? โดยที่ [LocID] = ? และ [ที่อยู่2] = ? และ [ประเทศ] = ? และ [ModBy] = ? และ [โมเดอเรเตอร์] = ? (ตั้งค่าการบันทึกเหตุการณ์เป็นทั้งหมดเพื่อดูค่าพารามิเตอร์) System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow จะต้องเป็นระหว่างวันที่ 1/1/2396 เวลา 00:00:00 น. ถึง 31/12/9999 เวลา 23:59:59 น. ที่

ดูเหมือนว่าฉันเดาถูกหรือไม่ว่าค่าว่างเริ่มต้นของ ModOn ในฐานข้อมูลทำให้เกิดปัญหา หากเป็นเช่นนั้น ฉันจะบันทึกบันทึกนี้โดยไม่เปลี่ยนค่าเริ่มต้นของ ModOn ได้อย่างไร


person boilers222    schedule 16.07.2015    source แหล่งที่มา


คำตอบ (1)


ซึ่งหมายความว่าคุณไม่เคยตั้งค่า ModOn ซึ่งหมายความว่ามีค่าเป็น 1/1/0001 ค่านี้ไม่สามารถจัดเก็บไว้ในฟิลด์ datetime ของ sql คุณสามารถตรวจสอบให้แน่ใจว่า obj.ModOn มีวันที่ที่ถูกต้องมากกว่า 1/1/1753 หรือเปลี่ยนคอลัมน์ sql เป็นประเภท datetime2

คุณยังสามารถทำเช่นนี้เพื่อเปลี่ยนค่าเป็น SqlDateTime.MinValue ก่อนที่จะบันทึก แต่เนื่องจากคุณไม่ได้ทำให้คอลัมน์เป็นทางเลือกโดยใช้ DateTime? คุณอาจมีปัญหาในการตรวจสอบความถูกต้องที่ใดที่หนึ่ง

public void UpdateCoLocation(tblCoLocation obj) {
    var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);

    if (upd != null) {
        upd.ModOn = obj.ModOn < System.Data.SqlTypes.SqlDateTime.MinValue ? 
            System.Data.SqlTypes.SqlDateTime.MinValue : 
            obj.ModOn;
        upd.ModBy = obj.ModBy;
    }

    dat.SaveChanges();
}
person JamieD77    schedule 16.07.2015
comment
ขอบคุณสำหรับการตอบกลับของคุณ. นี่เป็นหนึ่งในสิ่งแรกๆ ที่ฉันคิดเหมือนกัน และฉันก็แน่ใจว่าได้ตั้งค่า ModOn แล้ว ดังที่ฉันได้กล่าวไว้ในโพสต์เริ่มต้นของฉัน ฉันได้ก้าวผ่านโค้ดและตรวจสอบว่าทั้ง obj.ModOn และ upd.ModOn มีค่าเมื่อได้รับการเรียกไปยัง SaveChanges() ฉันยังลองใช้วันที่ฮาร์ดโค้ดสำหรับพวกเขาด้วย และนั่นก็ทำให้เกิดข้อผิดพลาดเดียวกัน - person boilers222; 17.07.2015
comment
@ boilers222 ลองตั้งค่าสถานะเอนทิตีเป็นแก้ไขก่อนบันทึกการเปลี่ยนแปลง () - person JamieD77; 18.07.2015