以下は、データ行から返される値、または値が 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);
}