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)
但是他们抛出一个异常: 指定的强制转换无效
有没有更优雅更有效的方法?
问题是像大多数 ADO 类DataTable
都是弱类型的,因此您可以直接从它们中提取的是object
. 原因是底层提供者决定了数据类型。例如,当您的底层数据来自某个数据库时,您期望的int
, 实际上可以是short
、uint
、ulong
或long
,甚至是DBNull.Value
值。因此,您需要使用Convert.To*
方法族才能完全安全。
但是在大多数情况下您不必做的一件事是调用ToString
. 如果它们是可转换的,转换函数将很好地转换这些值。通过可转换,我的意思是它们将失败,例如,如果您尝试转换long
大于int.MaxValue
to的值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")
. 当然,您可以通过一些检查并可能使用回退值等使此扩展更加健壮。