我正在尝试执行一个存储过程,然后使用 if 语句来检查空值,但我遇到了问题。我是一个 VB 人,所以如果我犯了一个小学生的语法错误,请容忍我。
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
rsData = objCmd.ExecuteReader();
rsData.Read();
if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value)))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
这是否允许我检查 SQL 连接是否只返回一个值,如果是,则填充我的字符串?
我习惯于只检查下面的内容以查看是否返回了值,并且不确定我是否使用 C# 正确执行了该操作
如果不是 IsDBNull(rsData("usr.ursrdaystime"))
如有任何帮助,我们将不胜感激!
这应该有效。
if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
还需要添加using语句,如下所示:
using (var objConn = new SqlConnection(strConnection))
{
objConn.Open();
using (var objCmd = new SqlCommand(strSQL, objConn))
{
using (var rsData = objCmd.ExecuteReader())
{
while (rsData.Read())
{
if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}
}
}
}
}
这将自动处置(关闭)块 { .. } 之外的资源。
惯用的说法是:
if(rsData["usr.ursrdaystime"] != DBNull.Value) {
strLevel = rsData["usr.ursrdaystime"].ToString();
}
这个:
rsData = objCmd.ExecuteReader();
rsData.Read();
使您看起来就像正在读取一个值。请使用
IDbCommand.ExecuteScalar
来代替。
考虑:
if(rsData.Read()) {
int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime"
if(rsData.IsDBNull(index)) {
// is a null
} else {
// access the value via any of the rsData.Get*(index) methods
}
} else {
// no row returned
}
另外:你需要更多
using
;p
三元运算符在这里应该表现得很好: 条件?第一个表达式:第二个表达式;
strLevel = !Convert.IsDBNull(rsData["usr.ursrdaystime"]) ? Convert.ToString(rsData["usr.ursrdaystime"]) : null
我知道这是一个 10 多年的老问题,但我遇到了这个问题,并且最近正在使用“Microsoft.Data.SqlClient”Version=“5.0.0-preview2.22096.2”在 .Net 6 应用程序中调试强制转换 SQL null 问题”,使用 DataTableReader
您需要在检索值之前使用阅读器的内置 IsDBNull 方法来测试值,因为使用任何 Get* 函数的隐式(或显式)转换可能会引发异常(因类型而异)
因此,对于 line-if 解决方案,以下内容是不好的: DateTime lastSentDate = DBNull.Value.Equals(reader.GetDateTime("LastSentDT")) ? reader.GetDateTime("LastSentDT") //Null无法转换为DateTime,抛出异常
这很好: DateTime lastSentDate = !reader.IsDBNull("LastSentDT") ? reader.GetDateTime("LastSentDT") : DateTime.Parse("1-1-2022");
希望这对 2022 年有帮助:)
if(!rsData.IsDBNull(rsData.GetOrdinal("usr.ursrdaystime")))
{
strLevel = rsData.GetString("usr.ursrdaystime");
}
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
我经常使用 String.IsNullorEmpty。这对她有用,因为当 DBNull 设置为 .ToString 时,它返回空。
if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
strLevel = rsData["usr.ursrdaystime"].toString();
}
还有这样一个替代选项:
strLevel = rsData.GetValue(0) is DBNull? "" : rsData.GetString(0);
您需要确切知道哪一列重要。
只需检查一下即可
string val= string.IsNullOrEmpty(rsData["usr.ursrdaystime"]?"":rsData["usr.ursrdaystime"].ToString())
不需要 System 前缀,因为几乎每个类都有该库。
if (reader["ColumnName"] != DBNull.Value)
{
do someting;
}
首次使用 ExecuteScalar
objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
object result = cmd.ExecuteScalar();
if(result == null)
strLevel = "";
else
strLevel = result.ToString();