c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性

c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性,第1张

概述任何人都可以建议一个方法,它可以返回数据行中列的值,并自动处理列值为null的可能性.基本上我试图想出一个利用DataRow扩展方法来处理DBNull值的通用解决方案.我的解决方案到现在为止: public static Nullable<T> SafeRead<T>(DataRow row, string fieldName) where T : struct{ if (row.Has 任何人都可以建议一个方法,它可以返回数据行中列的值,并自动处理列值为null的可能性.基本上我试图想出一个利用DaTarow扩展方法来处理dbnull值的通用解决方案.我的解决方案到现在为止:

public static Nullable<T> SafeRead<T>(DaTarow row,string fIEldname) where T : struct{    if (row.HasColumn(fIEldname))    {        return row.FIEld<Nullable<T>>(fIEldname) ?? default(Nullable<T>);    }    else        return default(Nullable<T>);}public static T SafeRead<T>(DaTarow row,string fIEldname) where T : class{    if (row.HasColumn(fIEldname))    {        return row.FIEld<T>(fIEldname) ?? default(T);    }    else        return default(T);}

但是这显然会引发方法模糊,因为C#不允许基于参数约束的方法重载

解决方法 以下内容将为您提供数据行中的值,如果值为dbnull.Value,则为类型的默认值.如果未定义该字段,则会抛出ArgumentException.

using System;using System.Data;public static class DataAccess{    public static T GetValueOrDefault<T>(DaTarow row,string fIEldname)    {        if (!row.table.Columns.Contains(fIEldname))        {            throw new ArgumentException(                string.Format("The given DaTarow does not contain a fIEld with the name \"{0}\".",fIEldname));        }        else if (row[fIEldname].Equals(dbnull.Value))        {            return default(T);        }        return row.FIEld<T>(fIEldname);    }}

以下是一些简单的测试:

[TestMethod]public voID GetValueOrDefault_ValueType_test(){    const string FIEldname = "Column";    const int Expected = 5;    Datatable datatable = new Datatable();    datatable.Columns.Add(FIEldname,typeof(int));    DaTarow row = datatable.Rows.Add(Expected);    int actual = DataAccess.GetValueOrDefault<int>(row,FIEldname);    Assert.AreEqual(Expected,actual);}[TestMethod]public voID GetValueOrDefault_ValueType_dbnull_test(){    const string FIEldname = "Column";    Datatable datatable = new Datatable();    datatable.Columns.Add(FIEldname,typeof(int));    DaTarow row = datatable.Rows.Add(dbnull.Value);    int actual = DataAccess.GetValueOrDefault<int>(row,FIEldname);    Assert.AreEqual(default(int),actual);}[TestMethod]public voID GetValueOrDefault_ReferenceType_test(){    const string FIEldname = "Column";    object expected = new object();    Datatable datatable = new Datatable();    datatable.Columns.Add(FIEldname,typeof(object));    DaTarow row = datatable.Rows.Add(expected);    object actual = DataAccess.GetValueOrDefault<object>(row,FIEldname);    Assert.AreEqual(expected,actual);}[TestMethod]public voID GetValueOrDefault_ReferenceType_dbnull_test(){    const string FIEldname = "Column";    Datatable datatable = new Datatable();    datatable.Columns.Add(FIEldname,typeof(object));    DaTarow row = datatable.Rows.Add(dbnull.Value);    object actual = DataAccess.GetValueOrDefault<object>(row,FIEldname);    Assert.AreEqual(default(object),actual);}
总结

以上是内存溢出为你收集整理的c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性全部内容,希望文章能够帮你解决c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234503.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存