มีคำตอบมากมายที่นี่พร้อมข้อมูลที่เป็นประโยชน์ (และข้อมูลผิดพลาด) แพร่กระจายไปทั่วฉันต้องการรวบรวมมันทั้งหมดเข้าด้วยกัน
คำตอบสั้น ๆ สำหรับคำถามคือตรวจสอบ DBNull - เกือบทุกคนเห็นด้วยกับบิตนี้ :)
แทนที่จะใช้เมธอดตัวช่วยในการอ่านค่า nullable ต่อชนิดข้อมูล SQL วิธีการทั่วไปช่วยให้เราสามารถจัดการกับสิ่งนี้ด้วยรหัสที่น้อยลง อย่างไรก็ตามคุณไม่สามารถมีวิธีการทั่วไปเพียงอย่างเดียวสำหรับทั้งประเภทค่าที่เป็นโมฆะและประเภทการอ้างอิงซึ่งจะกล่าวถึงที่ความยาวใน
ประเภท Nullable เป็นพารามิเตอร์ทั่วไปที่เป็นไปได้? และC # จำกัด ประเภททั่วไปสำหรับทุกอย่าง nullable
ดังนั้นจากคำตอบจาก @ZXX และ @getpsyched เราได้วิธีนี้ 2 วิธีในการรับค่า nullable และฉันได้เพิ่มวิธีที่ 3 สำหรับค่าที่ไม่ใช่ค่า null (มันเสร็จสิ้นการตั้งค่าตามการตั้งชื่อเมธอด)
public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
ฉันมักจะใช้ชื่อคอลัมน์แก้ไขเหล่านี้หากคุณใช้ดัชนีคอลัมน์ จากชื่อวิธีการเหล่านี้ฉันสามารถบอกได้ว่าฉันคาดหวังว่าข้อมูลจะเป็นโมฆะหรือไม่มีประโยชน์มากเมื่อดูโค้ดที่เขียนเมื่อนานมาแล้ว
เคล็ดลับ;
- ไม่มีคอลัมน์ที่ไม่มีค่าในฐานข้อมูลหลีกเลี่ยงปัญหานี้ หากคุณมีการควบคุมฐานข้อมูลแล้วคอลัมน์ควรจะไม่เป็นโมฆะโดยค่าเริ่มต้นและเป็นโมฆะเท่านั้นในกรณีที่จำเป็น
- อย่าส่งค่าฐานข้อมูลด้วยตัวดำเนินการ C # 'เป็น' เพราะหากการส่งผิดนั้นจะส่งคืนค่าว่าง
- การใช้นิพจน์ค่าเริ่มต้นจะเปลี่ยนค่า Null ของฐานข้อมูลเป็นค่าที่ไม่ใช่ค่า Null สำหรับประเภทค่าเช่น int, วันที่และเวลา, บิต ฯลฯ
สุดท้ายในขณะที่ทดสอบวิธีการข้างต้นในทุกประเภทข้อมูล SQL Server ฉันค้นพบว่าคุณไม่สามารถรับถ่าน [] โดยตรงจาก SqlDataReader ถ้าคุณต้องการถ่าน [] คุณจะต้องได้รับสตริงและใช้ ToCharArray ()
int colIndex = reader.GetOrdinal(fieldname);
และSafeGetString
ฟังก์ชั่นของ overload @ marc_s ได้อย่างง่ายดาย