微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

任何人都可以建议一个方法,它可以返回数据行中列的值,并自动处理列值为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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐