在C#中从返回的DataRow开始使用类型的推荐方法是什么?

时间:2009-09-04 20:16:34

标签: c# ado.net

循环访问DataRow并遇到诸如

之类的类型
DataRow dr;
dr["someString"]
dr["someInteger"]
dr["somedata"]

将它们纳入相应数据类型的最佳方法是什么? dr [“foo”]只是一个通用对象。

此外,这些是否可以轻松转换为可空类型? dr [“someInteger”]可以为null。

5 个答案:

答案 0 :(得分:8)

从DataRow读取时,您最大的敌人是空值。在DataRow中,当值为null时,它不等于null:它等于DBNull.Value

if(DBNull.Value == null)
{
   // Will never happen
}

除非您知道您的字段不能为空,否则投射是不安全的。例如,如果数据为DBNull,则以下示例将失败:

string name = (string)dr["Name"];

如果您可以使用LINQ扩展,则可以包含引用System.Data.DataSetExtensions和命名空间System.Data并调用

string name = dr.Field<string>("Name");

如果你不能使用LINQ,那么你必须回到使用

检查空值
string name = null;
if(!dr.IsNull("Name"))
    name = (string)dr["Name"];

或者您可以像这样编写自己的Field函数:

public static T GetValue<T>(object value)
{
    if (value == null || value == DBNull.Value)
        return default(T);
    else
        return (T)value;
}

以这种方式获得你的价值:

string name = GetValue<string>(dr["Name"]);

答案 1 :(得分:3)

如果您可以使用.net 3.5,那么如果您知道类型,则可以使用Field extension method更轻松地访问数据。一个例子是:

 string somestring= row.Field<string>("SomeString");

否则你会坚持将字段转换为旧式方式的对象类型。

答案 2 :(得分:2)

只需将值转换为正确的类型即可:

(string) dr["someString"];
(int?) dr["someInteger"];
(byte[]) dr["somedata"];

答案 3 :(得分:0)

string GetString(DataRow dr, string ColumnName)
{
    if (dr.IsNull(ColumnName)) 
    {
        return null;
    }
    return (string)dr[ColumnName];
}

答案 4 :(得分:0)

另一种选择是使用“as”

string str = dr["someString"] as string;

如果它是DBNull.Value(或任何其他非string类型的对象),则str将获得一个真正的“null”。否则它将获得正确的字符串值。

对于值类型,您可以使用nullable,即

int? i = dr["someint"] as int?;

同样,它将获得一个真正的“null”而不是DBNull.Value。但是,对于可空类型,您必须记住使用.Value,即

int x = i.Value + 5;