SqlDataReader returns int 字段为空白而不是 null
SqlDataReader returns blank instead of null for an int field
我正在使用 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"];
}
}
从数据库中读取 NULL int
字段时,
reader["Column1Name"]
为空,因此代码在运行时抛出 InvalidCastException。
我试过了
reader.GetInt32(reader.GetOrdinal("Column1Name"))
但这会抛出 System.Data.SqlTypes.SqlNullValueException.
我也试过了
reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
其中 return 为空,但类型是 SqlInt32
而不是我想要的 int?
。
我最后做了
if (!reader.IsDBNull(reader.GetOrdinal("Column1Name")))
int? var1 = (int?)reader["Column1Name"];
有效。
问题:
有没有比调用IsDBNull
方法更简单的方法呢?
如果数据库值为 NULL 且字段为 int
,为什么 reader["Column1Name"]
return 为空而不是 null
?
C# 无法将字符串转换为 int?使用(整数?)。最安全的方法是使用条件运算符检查是否为空,然后手动将值设置为空。
//Get the column index to prevent calling GetOrdinal twice
int COLUMNNAME1 = reader.GetOrdinal("ColumnName1");
while (reader.Read())
{
int? var1 = reader.IsDBNull(COLUMNNAME1) ? null : reader.GetInt32(COLUMNNAME1);
}
同样,如果您有非空数据类型,您可以检查它们是否为空并将它们设置为默认值。
int STRINGCOLUMN = reader.GetOrdinal("StringColumn");
int INTCOLUMN = reader.GetOrdinal("IntColumn");
int DATECOLUMN = reader.GetOrdinal("DateColumn");
int BOOLCOLUMN = reader.GetOrdinal("BoolColumn");
while (reader.Read())
{
string var1 = reader.IsDBNull(STRINGCOLUMN) ? "" : reader.GetString(STRINGCOLUMN);
int var2 = reader.IsDBNull(INTCOLUMN) ? 0 : reader.GetInt32(INTCOLUMN);
DateTime var3 = reader.IsDBNull(DATECOLUMN) ? DateTime.MinValue : reader.GetDateTime(DATECOLUMN);
bool var4 = reader.IsDBNull(BOOLCOLUMN) ? false : reader.GetBoolean(BOOLCOLUMN);
}
Why does reader["Column1Name"]
return blank instead of null if the db value is null and the field is an int
?
实际上,reader["Column1Name"]
returns DBNull.Value if the database value is NULL. (In the Visual Studio debugger, the value appears to be blank because DBNull.ToString() returns 是一个空字符串。)您不能使用强制转换将 DBNull.Value
直接转换为 int?
运算符。
Isn't there a simpler way then calling the IsDBNull
method?
是的,使用 as
运算符而不是强制转换:
int? var1 = reader["Column1Name"] as int?;
因为 DBNull.Value
不是 int
,as
运算符 returns null
.
我正在使用 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"];
}
}
从数据库中读取 NULL int
字段时,
reader["Column1Name"]
为空,因此代码在运行时抛出 InvalidCastException。
我试过了
reader.GetInt32(reader.GetOrdinal("Column1Name"))
但这会抛出 System.Data.SqlTypes.SqlNullValueException.
我也试过了
reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
其中 return 为空,但类型是 SqlInt32
而不是我想要的 int?
。
我最后做了
if (!reader.IsDBNull(reader.GetOrdinal("Column1Name")))
int? var1 = (int?)reader["Column1Name"];
有效。
问题:
有没有比调用
IsDBNull
方法更简单的方法呢?如果数据库值为 NULL 且字段为
int
,为什么reader["Column1Name"]
return 为空而不是null
?
C# 无法将字符串转换为 int?使用(整数?)。最安全的方法是使用条件运算符检查是否为空,然后手动将值设置为空。
//Get the column index to prevent calling GetOrdinal twice
int COLUMNNAME1 = reader.GetOrdinal("ColumnName1");
while (reader.Read())
{
int? var1 = reader.IsDBNull(COLUMNNAME1) ? null : reader.GetInt32(COLUMNNAME1);
}
同样,如果您有非空数据类型,您可以检查它们是否为空并将它们设置为默认值。
int STRINGCOLUMN = reader.GetOrdinal("StringColumn");
int INTCOLUMN = reader.GetOrdinal("IntColumn");
int DATECOLUMN = reader.GetOrdinal("DateColumn");
int BOOLCOLUMN = reader.GetOrdinal("BoolColumn");
while (reader.Read())
{
string var1 = reader.IsDBNull(STRINGCOLUMN) ? "" : reader.GetString(STRINGCOLUMN);
int var2 = reader.IsDBNull(INTCOLUMN) ? 0 : reader.GetInt32(INTCOLUMN);
DateTime var3 = reader.IsDBNull(DATECOLUMN) ? DateTime.MinValue : reader.GetDateTime(DATECOLUMN);
bool var4 = reader.IsDBNull(BOOLCOLUMN) ? false : reader.GetBoolean(BOOLCOLUMN);
}
Why does
reader["Column1Name"]
return blank instead of null if the db value is null and the field is anint
?
实际上,reader["Column1Name"]
returns DBNull.Value if the database value is NULL. (In the Visual Studio debugger, the value appears to be blank because DBNull.ToString() returns 是一个空字符串。)您不能使用强制转换将 DBNull.Value
直接转换为 int?
运算符。
Isn't there a simpler way then calling the
IsDBNull
method?
是的,使用 as
运算符而不是强制转换:
int? var1 = reader["Column1Name"] as int?;
因为 DBNull.Value
不是 int
,as
运算符 returns null
.