วิธีที่ดีที่สุดในการตรวจสอบว่าตารางข้อมูลมีค่า null หรือไม่


90

วิธีที่ดีที่สุดในการตรวจสอบว่าตารางข้อมูลมีค่าว่างอยู่หรือไม่?

เวลาส่วนใหญ่ในสถานการณ์ของเราหนึ่งคอลัมน์จะมีค่าว่างทั้งหมด

(ข้อมูลนี้ถูกส่งคืนโดยแอปพลิเคชันของบุคคลที่สาม - เรากำลังพยายามที่จะประเมินค่าก่อนที่แอปพลิเคชันของเราจะประมวลผลตารางข้อมูล)


คำตอบ:


168

ลองเปรียบเทียบค่าของคอลัมน์กับDBNull.Valueค่าเพื่อกรองและจัดการค่า null ด้วยวิธีใดก็ได้ที่คุณเห็นว่าเหมาะสม

foreach(DataRow row in table.Rows)
{
    object value = row["ColumnName"];
    if (value == DBNull.Value)
        // do something
    else
        // do something else
}

ข้อมูลเพิ่มเติมเกี่ยวกับคลาส DBNull


หากคุณต้องการตรวจสอบว่ามีค่า null ในตารางหรือไม่คุณสามารถใช้วิธีนี้:

public static bool HasNull(this DataTable table)
{
    foreach (DataColumn column in table.Columns)
    {
        if (table.Rows.OfType<DataRow>().Any(r => r.IsNull(column)))
            return true;
    }

    return false;
}

ซึ่งจะให้คุณเขียนสิ่งนี้:

table.HasNull();

1
แนวทางปฏิบัติที่ดีที่สุดสำหรับวิธีการขยายนี้ควรไปที่ใด
StuperUser

6
โดยปกติฉันจะสร้างโฟลเดอร์ "Extensions" ในไลบรารีทั่วไปหรือใน DAL ของฉัน สร้างไฟล์ชื่อ "DataTableExtensions.cs" และเพิ่มเมธอดนั้น จากนั้นคุณจะเพิ่ม "โดยใช้ Name.Space.Extensions" ในไฟล์ cs ของคุณและสามารถเข้าถึงวิธีการขยายทั้งหมดที่กำหนดไว้
นักล่า

3
คุณสามารถ (ตอนนี้) ใช้table.AsEnumerable()แทนtable.Rows.OfType<DataRow>()
Teejay


11

คุณสามารถวนซ้ำโยนแถวและคอลัมน์ตรวจสอบค่า null ติดตามว่ามีโมฆะที่มีบูลหรือไม่จากนั้นตรวจสอบหลังจากวนลูปผ่านตารางและจัดการ

//your DataTable, replace with table get code
DataTable table = new DataTable();
bool tableHasNull = false;

foreach (DataRow row in table.Rows)
{
    foreach (DataColumn col in table.Columns)
    {
        //test for null here
        if (row[col] == DBNull.Value)
        {
            tableHasNull = true;
        }
    }
}

if (tableHasNull)
{
    //handle null in table
}

คุณยังสามารถออกมาจาก foreach loop ด้วยคำสั่ง break เช่น

//test for null here
if (row[col] == DBNull.Value)
{
    tableHasNull = true;
    break;
}

เพื่อบันทึกการวนซ้ำในส่วนที่เหลือของตาราง



0

คุณสามารถ null / blank / space ค่า Etc โดยใช้ LinQ ใช้แบบสอบถามต่อไปนี้

   var BlankValueRows = (from dr1 in Dt.AsEnumerable()
                                  where dr1["Columnname"].ToString() == ""
                                  || dr1["Columnname"].ToString() == ""
                                   || dr1["Columnname"].ToString() == ""
                                  select Columnname);

ที่นี่แทนที่Columnnameด้วยชื่อคอลัมน์ตารางและ""รายการค้นหาของคุณในโค้ดด้านบนเรากำลังมองหาค่า null


0
DataTable dt = new DataTable();
foreach (DataRow dr in dt.Rows)
{
    if (dr["Column_Name"] == DBNull.Value)
    {
        //Do something
    }
    else
    {
        //Do something
    }
}

5
แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่ก็ควรอธิบายวิธีแก้ปัญหาและระบุรหัสเป็นตัวอย่างหรือข้อมูลอ้างอิงได้ดีกว่า คำตอบแบบใช้รหัสเท่านั้นอาจทำให้สับสนและขาดบริบท
Robert Columbia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.