dfm*_*tro 6 .net c# sql-server ado.net sqldatareader
我正在使用SqlDataReader从SQL Server 2012数据库中获取数据:
SqlConnection connection = (SqlConnection)_db.Database.GetDbConnection();
await connection.OpenAsync();
SqlCommand command = new SqlCommand("dbo.[sp_MyStoredPrc] @InputId=1", connection);
var reader = await command.ExecuteReaderAsync();
if (reader.HasRows)
{
while (reader.Read())
{
int? var1 = (int?)reader["Column1Name"];
}
}
Run Code Online (Sandbox Code Playgroud)
int从数据库读取NULL 字段时,该字段
reader["Column1Name"]为空,因此代码在运行时引发InvalidCastException。
我试过了
reader.GetInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)
但这会引发System.Data.SqlTypes.SqlNullValueException。
我也尝试过
reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)
返回null,但类型SqlInt32不是int?我想要的。
我最终做了
if (!reader.IsDBNull(reader.GetOrdinal("Column1Name")))
int? var1 = (int?)reader["Column1Name"];
Run Code Online (Sandbox Code Playgroud)
哪个有效。
问题:
有没有比调用该IsDBNull方法更简单的方法?
为什么为什么reader["Column1Name"]返回nulldb 而不是db值为NULL且字段为a int?
reader["Column1Name"]如果 db 值为 null 并且字段为 ,为什么返回空白而不是 nullint?
实际上,如果数据库值为 NULL,reader["Column1Name"]则返回DBNull.Value 。(在 Visual Studio 调试器中,该值显示为空,因为DBNull.ToString()返回空字符串。)不能DBNull.Value直接int?使用强制转换运算符进行强制转换。
难道就没有比调用
IsDBNull方法更简单的方法了吗?
是的,使用as运算符而不是强制转换:
int? var1 = reader["Column1Name"] as int?;
Run Code Online (Sandbox Code Playgroud)
因为DBNull.Value不是int,所以as运算符返回null。