SQL Data Reader - การจัดการค่าคอลัมน์ Null


297

ฉันใช้ SQLdatareader เพื่อสร้าง POCO จากฐานข้อมูล รหัสทำงานยกเว้นเมื่อพบค่า Null ในฐานข้อมูล ตัวอย่างเช่นหากคอลัมน์ FirstName ในฐานข้อมูลมีค่า Null ข้อผิดพลาดจะถูกส่งออกไป

employee.FirstName = sqlreader.GetString(indexFirstName);

วิธีที่ดีที่สุดในการจัดการค่าว่างในสถานการณ์นี้คืออะไร?

คำตอบ:


470

คุณต้องตรวจสอบIsDBNull:

if(!SqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

นั่นเป็นวิธีเดียวที่เชื่อถือได้ของคุณในการตรวจจับและจัดการสถานการณ์นี้

ฉันห่อสิ่งเหล่านั้นเป็นวิธีการขยายและมีแนวโน้มที่จะคืนค่าเริ่มต้นถ้าคอลัมน์แน่นอนnull:

public static string SafeGetString(this SqlDataReader reader, int colIndex)
{
   if(!reader.IsDBNull(colIndex))
       return reader.GetString(colIndex);
   return string.Empty;
}

ตอนนี้คุณสามารถเรียกมันได้ดังนี้:

employee.FirstName = SqlReader.SafeGetString(indexFirstName);

และคุณจะไม่ต้องกังวลเกี่ยวกับข้อยกเว้นหรือnullค่าอีกต่อไป


64
หากมีคนต้องการชื่อคอลัมน์มากกว่าดัชนีคุณสามารถทำ: int colIndex = reader.GetOrdinal(fieldname);และSafeGetStringฟังก์ชั่นของ overload @ marc_s ได้อย่างง่ายดาย
ilans

ไม่สามารถเชื่อว่าฉันมาที่นี่ในปี 2562 ใน VB ไม่น้อย .......... ขอบคุณแม้ว่าความช่วยเหลือที่ดี
JimmyB

นอกจากนี้ยังสามารถทำได้เช่นนี้: int ordinal = reader.GetOrdinal ("col_name"); UINT? val = reader.IsDBNull (ลำดับ)? (uint?) null: reader.GetUInt32 (ลำดับ);
ed22

สวัสดีทุกคน! ฉันพยายามคัดลอกและวางลงในแบบฟอร์มและส่งคืนพร้อมข้อผิดพลาด "วิธีการขยายต้องถูกกำหนดในคลาสที่ไม่ใช่แบบทั่วไป".
Jansen Malaggay

หากคุณกำลังใช้ reader.GetOrindal ภายใน SafeGetString และคุณต้องการใช้ SafeGetString ภายในลูปสิ่งนี้จะเกิดขึ้นได้อย่างไรหากไม่มีประสิทธิภาพการทำงาน
AspUser7724

223

คุณควรใช้ตัวasดำเนินการที่รวมกับตัว??ดำเนินการสำหรับค่าเริ่มต้น ประเภทค่าจะต้องอ่านเป็นโมฆะและกำหนดค่าเริ่มต้น

employee.FirstName = sqlreader[indexFirstName] as string;
employee.Age = sqlreader[indexAge] as int? ?? default(int);

asประกอบการจัดการหล่อรวมทั้งการตรวจสอบสำหรับ DBNull


6
หากมีคนเปลี่ยนคอลัมน์อายุจากการเป็น int เป็น SQL bigint (c # ยาว) โค้ดของคุณจะล้มเหลวโดยการส่งคืน 0 คำตอบจาก ZXX นั้นน่าเชื่อถือยิ่งกว่า IMO
Martin Ørding-Thomsen

ฉันสงสัยว่าคุณสามารถแทนที่ค่าเริ่มต้น (int) เป็น -1 แทน 0
Chris

5
@Chris - คุณควรจะสามารถแทนที่ค่าเริ่มต้น (int) ด้วย -1
stevehipwell

@ Stevo3000 คุณถูกต้อง! ฉันพยายามที่และมันทำงานที่คุณกล่าวว่าหลังจากที่ผมโพสต์ แต่ฉันลืมที่จะกลับไปยังหน้านี้ :) มา
คริส

5
โปรดทราบว่าการใช้ "เป็น" ที่นี่สามารถซ่อนข้อผิดพลาดของดัชนี ถ้าคุณตั้งใจใช้คุณก็จะได้รับsqlreader[indexAge] as string ?? "" ""พิจารณาว่าคุณต้องการจริงๆ(int?)sqlreader[indexAge] ?? defaultValueหรือไม่ดังนั้นหาก SQL ของคุณเปลี่ยนคุณจะได้รับการยกเว้นแทนค่าที่ไม่ดี @ Stevo3000: ค่าเริ่มต้น (int) คือ 0 ไม่ใช่ -1 @Chris: ตรวจสอบว่าคุณใช้สิ่งที่คุณต้องการจริงๆ
me22

30

สำหรับสตริงคุณสามารถเพียงแค่โยนเวอร์ชั่นของวัตถุ (เข้าถึงได้โดยใช้โอเปอเรเตอร์ของอาร์เรย์) และไขด้วยสตริง null สำหรับโมฆะ:

employee.FirstName = (string)sqlreader[indexFirstName];

หรือ

employee.FirstName = sqlreader[indexFirstName] as string;

สำหรับจำนวนเต็มถ้าคุณส่งไปยัง int nullable คุณสามารถใช้ GetValueOrDefault ()

employee.Age = (sqlreader[indexAge] as int?).GetValueOrDefault();

หรือตัวดำเนินการรวมศูนย์??ว่างเปล่า( )

employee.Age = (sqlreader[indexAge] as int?) ?? 0;

2
บล็อกที่ชัดเจนดังตัวอย่างแรกของคุณไม่ทำงาน มันส่งข้อผิดพลาดเดียวกัน
musefan

@musefan: เขตข้อมูลของคุณเป็นสตริงจริงหรือ ถ้าไม่ใช่คุณจะได้รับข้อผิดพลาดอื่น สิ่งนี้ใช้ได้ผลและสิ่งเหล่านี้ไม่มีความแตกต่างจริงระหว่างตัวอย่างที่ 1 และ 2 (นอกเหนือจากไวยากรณ์)
Gone Coding

1
@GoneCoding: ใช่มันเป็นสตริงที่ไม่มีค่าและแน่นอนว่ากรณีแรกที่ทำให้เกิดปัญหาเมื่อคนที่สองทำงาน ฉันคิดว่าปัญหาเกิดจากการจัดการค่า Null ในขณะที่พวกเขาไม่ได้nullแต่วัตถุ DBNull แทน ความแตกต่างระหว่างสองคำสั่งคือคำสั่งแรกจะล้มเหลวหากไม่ใช่สตริงในขณะที่คำสั่งที่สองจะส่งคืนค่าว่างหากไม่ใช่สตริง
musefan

23

IsDbNull(int)มักจะช้ากว่าการใช้วิธีการเช่นนั้นเมื่อเทียบกับGetSqlDateTime ลองใช้วิธีการเหล่านี้สำหรับส่วนขยายDBNull.ValueSqlDataReader

public static T Def<T>(this SqlDataReader r, int ord)
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return default(T);
    return ((INullable)t).IsNull ? default(T) : (T)t;
}

public static T? Val<T>(this SqlDataReader r, int ord) where T:struct
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? (T?)null : (T)t;
}

public static T Ref<T>(this SqlDataReader r, int ord) where T : class
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? null : (T)t;
}

ใช้พวกเขาเช่นนี้

var dd = r.Val<DateTime>(ords[4]);
var ii = r.Def<int>(ords[0]);
int nn = r.Def<int>(ords[0]);

5
ฉันพบว่าตัวดำเนินการอย่างชัดเจนในประเภท System.Data.SqlTypes กำลังโยนข้อผิดพลาดทุกที่ที่พยายามใช้รหัสนี้ ...
Tetsujin no Oni

ดูstackoverflow.com/a/21024873/1508467สำหรับคำอธิบายว่าทำไมบางครั้งจึงล้มเหลว (ลองใช้ Val <int> เพื่ออ่านคอลัมน์ int SQL)
ริสโจนส์


12

reader.IsDbNull(ColumnIndex) ทำงานเป็นคำตอบจำนวนมากพูดว่า

และฉันอยากจะพูดถึงถ้าคุณทำงานกับชื่อคอลัมน์การเปรียบเทียบประเภทอาจจะสะดวกกว่า

if(reader["TeacherImage"].GetType() == typeof(DBNull)) { //logic }

นอกจากนี้ยังสามารถใช้งานได้กับ System.Data เวอร์ชันเก่าและ. NET FW
RaSor

11

ฉันไม่คิดว่าจะมีค่าคอลัมน์เป็นโมฆะเมื่อมีการส่งคืนแถวภายในชุดข้อมูลโดยใช้ชื่อคอลัมน์

หากคุณทำเช่นdatareader["columnName"].ToString();นั้นจะให้ค่าที่สามารถเป็นสตริงว่างได้เสมอ ( String.Emptyหากคุณต้องการเปรียบเทียบ)

ฉันจะใช้สิ่งต่อไปนี้และจะไม่ต้องกังวลมากเกินไป:

employee.FirstName = sqlreader["columnNameForFirstName"].ToString();

4
คุณสามารถอ่าน [FieldName] ได้ == DBNull.Value เพื่อตรวจสอบค่า NULL
Ralph Willgoss

11

โซลูชันนี้ขึ้นอยู่กับผู้ขายน้อยลงและทำงานร่วมกับ SQL, OleDB และ MySQL Reader:

public static string GetStringSafe(this IDataReader reader, int colIndex)
{
    return GetStringSafe(reader, colIndex, string.Empty);
}

public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetString(colIndex);
    else
        return defaultValue;
}

public static string GetStringSafe(this IDataReader reader, string indexName)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName));
}

public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
}

1
การคัดลอกและการปรับแต่งรหัสนี้ลงในชั้นเรียนส่วนขยายโดยตรงในขณะนี้
qxotk

8

สิ่งที่ฉันมักจะทำคือแทนที่ค่าว่างในคำสั่ง SELECT ด้วยสิ่งที่เหมาะสม

SELECT ISNULL(firstname, '') FROM people

ที่นี่ฉันจะแทนที่ทุก null ด้วยสตริงว่าง รหัสของคุณจะไม่เกิดข้อผิดพลาดในกรณีนั้น


หากเป็นไปได้ให้ใช้วิธีนี้หลีกเลี่ยงค่า Null มิฉะนั้นฉันชอบคำตอบของผู้ช่วย Sonny Boy
ไม่คืนเงินไม่มีผลตอบแทน

3
ทำไมต้องใช้ตัวช่วยแบบคงที่และแยกกัน วิธีการขยายใน SqlDataReader ดูเหมือนจะไม่น่าสนใจและใช้งานง่ายกว่าหรือไม่?
marc_s

7

คุณสามารถเขียนฟังก์ชัน Generic เพื่อตรวจสอบ Null และรวมค่าเริ่มต้นเมื่อเป็น NULL เรียกสิ่งนี้เมื่ออ่าน Datareader

public T CheckNull<T>(object obj)
        {
            return (obj == DBNull.Value ? default(T) : (T)obj);
        }

เมื่ออ่านการใช้งาน Datareader

                        while (dr.Read())
                        {
                            tblBPN_InTrRecon Bpn = new tblBPN_InTrRecon();
                            Bpn.BPN_Date = CheckNull<DateTime?>(dr["BPN_Date"]);
                            Bpn.Cust_Backorder_Qty = CheckNull<int?>(dr["Cust_Backorder_Qty"]);
                            Bpn.Cust_Min = CheckNull<int?>(dr["Cust_Min"]);
                         }


4

วิธีการเกี่ยวกับการสร้างวิธีการช่วยเหลือ

สำหรับ String

private static string MyStringConverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return "";

        return o.ToString();
    }

การใช้

MyStringConverter(read["indexStringValue"])

สำหรับ Int

 private static int MyIntonverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return 0;

        return Convert.ToInt32(o);
    }

การใช้

MyIntonverter(read["indexIntValue"])

สำหรับวันที่

private static DateTime? MyDateConverter(object o)
    {
        return (o == DBNull.Value || o == null) ? (DateTime?)null : Convert.ToDateTime(o);
    }

การใช้

MyDateConverter(read["indexDateValue"])

หมายเหตุ: สำหรับ DateTime ประกาศ varialbe เป็น

DateTime? variable;

4

นอกเหนือจากคำตอบโดย marc_s คุณสามารถใช้วิธีการขยายทั่วไปเพิ่มเติมเพื่อรับค่าจาก SqlDataReader:

public static T SafeGet<T>(this SqlDataReader reader, int col)
    {
        return reader.IsDBNull(col) ? default(T) : reader.GetFieldValue<T>(col);
    }

ฉันจะไม่เรียกวิธีนี้ว่า "SafeGet" เพราะถ้า T เป็นโครงสร้างมันจะแปลงค่า Null ให้เป็นค่าเริ่มต้นที่ไม่ใช่ค่า N สำหรับ T - ไม่ปลอดภัยจริงๆ อาจเป็น "GetValueOrDefault"
ริสโจนส์

@ RhysJones ทำไมคุณถึงมี T เป็น struct ในกรณีนี้ แม้ว่าคุณจะฉันจะยืนยันว่าค่าเริ่มต้นที่ไม่ใช่โมฆะใน struct คือพฤติกรรมที่คาดหวัง
getpsyched

@RhysJones แต่ฉันยอมรับว่าวิธีนี้อาจไม่ปลอดภัยก็จะต้องจัดการข้อยกเว้นเช่น InvalidCastException จาก SqlDataReader
getpsyched

4

โดยอิทธิพลจากคำตอบของ getpsychedฉันสร้างวิธีการทั่วไปซึ่งตรวจสอบค่าคอลัมน์ตามชื่อ

public static T SafeGet<T>(this System.Data.SqlClient.SqlDataReader reader, string nameOfColumn)
{
  var indexOfColumn = reader.GetOrdinal(nameOfColumn);
  return reader.IsDBNull(indexOfColumn) ? default(T) : reader.GetFieldValue<T>(indexOfColumn);
}

การใช้งาน:

var myVariable = SafeGet<string>(reader, "NameOfColumn")

ฉันไม่รู้ว่าคุณเป็นใคร แต่อวยพรคุณ ฟังก์ชั่นนี้ประหยัดกว่าการทำงานสามชั่วโมง
Ramneek Singh


2

เราใช้ชุดวิธีการคงที่เพื่อดึงค่าทั้งหมดออกจากตัวอ่านข้อมูลของเรา ดังนั้นในกรณีนี้เราจะเรียกDBUtils.GetString(sqlreader(indexFirstName)) ประโยชน์ของการสร้างวิธีการแบบคงที่ / ที่ใช้ร่วมกันคือคุณไม่จำเป็นต้องตรวจสอบซ้ำแล้วซ้ำอีก ...

วิธีการคงที่จะมีรหัสเพื่อตรวจสอบ nulls (ดูคำตอบอื่น ๆ ในหน้านี้)


2

คุณสามารถใช้โอเปอเรเตอร์ที่มีเงื่อนไขได้:

employee.FirstName = sqlreader["indexFirstName"] != DBNull.Value ? sqlreader[indexFirstName].ToString() : "";

เช่นเดียวกับหนึ่งในคำตอบด้านล่าง แต่ 8 ปีหลัง!
beercohol

2

มีคำตอบมากมายที่นี่พร้อมข้อมูลที่เป็นประโยชน์ (และข้อมูลผิดพลาด) แพร่กระจายไปทั่วฉันต้องการรวบรวมมันทั้งหมดเข้าด้วยกัน

คำตอบสั้น ๆ สำหรับคำถามคือตรวจสอบ 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 ()


1

ฉันกำลังใช้รหัสที่แสดงด้านล่างเพื่อจัดการเซลล์ว่างในแผ่นงาน Excel ที่อ่านไปยัง datatable

if (!reader.IsDBNull(2))
{
   row["Oracle"] = (string)reader[2];
}

1
private static void Render(IList<ListData> list, IDataReader reader)
        {
            while (reader.Read())
            {

                listData.DownUrl = (reader.GetSchemaTable().Columns["DownUrl"] != null) ? Convert.ToString(reader["DownUrl"]) : null;
                //没有这一列时,让其等于null
                list.Add(listData);
            }
            reader.Close();
        }

1

และ / หรือใช้ผู้ประกอบการที่ประกอบไปด้วยการมอบหมาย:

employee.FirstName = rdr.IsDBNull(indexFirstName))? 
                     String.Empty: rdr.GetString(indexFirstName);

แทนที่ค่าเริ่มต้น (เมื่อเป็นโมฆะ) ตามความเหมาะสมสำหรับแต่ละประเภทคุณสมบัติ ...


1

วิธีการนี้จะขึ้นอยู่กับ indexFirstName ซึ่งควรเป็นลำดับคอลัมน์ตามศูนย์

if(!sqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

หากคุณไม่รู้จักดัชนีคอลัมน์ แต่ไม่ต้องการตรวจสอบชื่อคุณสามารถใช้วิธีการขยายนี้แทน:

public static class DataRecordExtensions
{
    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i=0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }
}

และใช้วิธีการเช่นนี้:

if(sqlReader.HasColumn("FirstName"))
{
  employee.FirstName = sqlreader["FirstName"];
}

1

คำถามเก่า แต่อาจมีบางคนยังต้องการคำตอบ

ในความเป็นจริงฉันหลีกเลี่ยงปัญหานี้เช่นนั้น

สำหรับ int:

public static object GatDataInt(string Query, string Column)
    {
        SqlConnection DBConn = new SqlConnection(ConnectionString);
        if (DBConn.State == ConnectionState.Closed)
            DBConn.Open();
        SqlCommand CMD = new SqlCommand(Query, DBConn);
        SqlDataReader RDR = CMD.ExecuteReader();
        if (RDR.Read())
        {
            var Result = RDR[Column];
            RDR.Close();
            DBConn.Close();
            return Result;
        }
        return 0;
    }

เหมือนกันสำหรับสตริงเพียงแค่กลับ "" แทนที่จะเป็น 0 เพราะ "" เป็นสตริงที่ว่างเปล่า

เพื่อให้คุณสามารถใช้งานได้เหมือน

int TotalPoints = GatDataInt(QueryToGetTotalPoints, TotalPointColumn) as int?;

และ

string Email = GatDatastring(QueryToGetEmail, EmailColumn) as string;

มีความยืดหยุ่นสูงเพื่อให้คุณสามารถแทรกแบบสอบถามเพื่ออ่านคอลัมน์ใด ๆ และจะไม่กลับมาพร้อมกับข้อผิดพลาด


0

นี่คือคลาสตัวช่วยซึ่งคนอื่นสามารถใช้หากพวกเขาต้องการตาม @marc_s คำตอบ:

public static class SQLDataReaderExtensions
    {
        public static int SafeGetInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? 0 : dataReader.GetInt32(fieldIndex);
        }

        public static int? SafeGetNullableInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as int?;
        }

        public static string SafeGetString(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? string.Empty : dataReader.GetString(fieldIndex);
        }

        public static DateTime? SafeGetNullableDateTime(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as DateTime?;
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName)
        {
            return SafeGetBoolean(dataReader, fieldName, false);
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName, bool defaultValue)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? defaultValue : dataReader.GetBoolean(fieldIndex);
        }
    }


-2

คุณสามารถตรวจสอบสิ่งนี้ได้เช่นกัน

if(null !=x && x.HasRows)
{ ....}

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