完美解决SqlDataReader指定转换无效
在使用SqlDataReader读取SQL Server数据库查询结果时,经常会遇到“指定转换无效”(Invalid cast from 'System.String' to 'System.Int32')的错误。这种错误通常是由于将字符串类型的列强制转换为数值类型而引起的。以下是一些可能的解决方法:
1. 使用“as”操作符进行安全类型转换
在读取数据库中的数据时,可以使用C# 7的“as”操作符进行安全类型转换。使用as操作符时,如果转换失败,则返回null,而不是抛出异常。例如,可以将以下代码:
int id = (int)reader["ID"];
替换为:
int? id = reader["ID"] as int?;
这样,如果ID列不是整数类型,则id变量将设置为null,而不会抛出异常。
2. 使用TryParse方法进行转换
另一种解决方法是使用数值类型的TryParse方法进行转换。例如,可以将以下代码:
int id = Convert.ToInt32(reader["ID"]);
替换为:
int.TryParse(reader["ID"].ToString(), out int id);
这样,如果ID列不是整数类型,TryParse方法将返回false,并且id变量将设置为0。
3. 使用扩展方法进行转换
还可以通过创建扩展方法来自动执行数据类型转换。例如,可以创建以下扩展方法:
public static class ReaderExtensions
{
public static T Get<T>(this SqlDataReader reader, string columnName)
{
object value = reader[columnName];
if (value == DBNull.Value)
{
return default(T);
}
return (T)Convert.ChangeType(value, typeof(T));
}
}
这个扩展方法可以通过以下代码调用:
int id = reader.Get<int>("ID");
这样,在转换数据类型时,扩展方法将使用Convert.ChangeType方法。如果该方法无法转换数据类型,则会引发异常。但是,如果数据是NULL值,则该方法会返回类型的默认值。
4. 使用Nullable类型
最后,如果数据库中的列可能包含NULL值,则可以使用Nullable类型。通过使用Nullable类型,可以避免在读取NULL值时引发异常。例如,可以将以下代码:
int id = (int)reader["ID"];
替换为:
int? id = reader["ID"] as int?;
或者:
int? id = reader.IsDBNull(reader.GetOrdinal("ID")) ? null : (int?)reader["ID"];
这样,如果ID列包含NULL值,则id变量将设置为null。
总结
要避免“指定转换无效”的错误,可以使用安全类型转换,TryParse方法,扩展方法或Nullable类型。使用这些方法可以轻松地转换数据库中的数据类型,并避免引发异常。
