从DataRow获取int值而不转换为字符串

时间:2017-02-15 07:18:37

标签: c# ado.net type-conversion

我有一个数据库字段为int。 当我尝试这个时:

int val = Convert.ToInt32(row["Int_Field_Name"].ToString());

它有效。

但这看起来非常糟糕且无效。

我试过这些:

int val = row.Field<int>("Int_Field_Name");
int val = (int)row["Int_Field_Name"];

但他们抛出异常: 指定演员无效

是否有更优雅,更有效的方式?

2 个答案:

答案 0 :(得分:2)

尝试:

 int q = Convert.ToInt32(row["Int_Field_Name"]);

还有ToInt16和64,取决于你需要的东西

答案 1 :(得分:2)

问题是大多数像DataTable这样的ADO类是弱类型的,所以你可以直接从它们中提取object。原因是底层提供者决定数据类型是什么。例如,当您的基础数据来自某个数据库时,您期望成为int,实际上可能是shortuintulong或{{1} },甚至long值。因此,您需要使用DBNull.Value方法系列才能完全安全。

但是在大​​多数情况下你不必做的一件事是调用Convert.To*。转换函数将很好地转换值,如果它们是可转换的。转换我的意思是,如果您尝试将大于ToString的{​​{1}}值转换为long,它们将会失败。

所以你最好的选择是使用

int.MaxValue

如果你觉得这很丑陋(我也有点),你可以引入扩展方法,比如

int

并像Convert.ToInt32(row["Int_Field_Name"]) 一样使用它。当然,您可以通过一些检查使这个扩展更加健壮,并且可能具有回退值等。