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

循环遍历DataRow并遇到类型等

DataRow dr; dr["someString"] dr["someInteger"] dr["somedata"] 

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

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

从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("Name"); 

如果你不能使用LINQ,那么你必须回过头来检查null值

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

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

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

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

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

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

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

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

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

 (string) dr["someString"]; (int?) dr["someInteger"]; (byte[]) dr["somedata"]; 
 string GetString(DataRow dr, string ColumnName) { if (dr.IsNull(ColumnName)) { return null; } return (string)dr[ColumnName]; } 

另一种选择是使用“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;