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

Kob*_*uek 3 c# ado.net type-conversion

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

int val = Convert.ToInt32(row["Int_Field_Name"].ToString());
Run Code Online (Sandbox Code Playgroud)

有用。

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

我试过这些:

int val = row.Field<int>("Int_Field_Name");
int val = (int)row["Int_Field_Name"];
Run Code Online (Sandbox Code Playgroud)

但是他们抛出一个异常: 指定的强制转换无效

有没有更优雅更有效的方法?

Zol*_*ási 6

问题是像大多数 ADO 类DataTable都是弱类型的,因此您可以直接从它们中提取的是object. 原因是底层提供者决定了数据类型。例如,当您的底层数据来自某个数据库时,您期望的int, 实际上可以是shortuintulonglong,甚至是DBNull.Value值。因此,您需要使用Convert.To*方法族才能完全安全。

但是在大多数情况下您不必做的一件事是调用ToString. 如果它们是可转换的,转换函数将很好地转换这些值。通过可转换,我的意思是它们将失败,例如,如果您尝试转换long大于int.MaxValueto的值int

所以你最好的选择是使用

Convert.ToInt32(row["Int_Field_Name"])
Run Code Online (Sandbox Code Playgroud)

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

public static int GetInt(this DataRow row, string fieldName) {
    return Convert.ToInt32(row[fieldName]);
}
Run Code Online (Sandbox Code Playgroud)

并像myRow.GetInt("Int_Field_Name"). 当然,您可以通过一些检查并可能使用回退值等使此扩展更加健壮。