DBNull if 语句

我尝试执行一个存储过程,然后使用 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 连接是否只返回一个值,如果是,那么填充我的字符串?

I'm used to being able to just check the below to see if a value is being returned and not sure I'm doing it correctly with C#

如果不是 IsDBNull (rsData (“ usr.urrdaystime”))

如果你能帮忙,我会很感激的!

192419 次浏览

这个应该可以。

if (rsData["usr.ursrdaystime"] != System.DBNull.Value))
{
strLevel = rsData["usr.ursrdaystime"].ToString();
}

还需要添加使用语句,如下面的语句:

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 (reader["usr.ursrdaystime"] != DBNull.Value)

.Equals()正在检查 两个 Object 实例是相同的

考虑一下:

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;

首先使用 ExecuteScalar

 objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
object result = cmd.ExecuteScalar();
if(result == null)
strLevel = "";
else
strLevel = result.ToString();

最接近 VB 的版本是(看这个) :

Convert.IsDBNull()

但是有很多方法可以做到这一点,大多数是链接 从这里

我经常使用 String.IsNullorEmpty。它会起作用,因为当 DBNull 设置为.ToString 时,它返回空值。

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
strLevel = rsData["usr.ursrdaystime"].toString();
}

三元运算符在这里应该可以很好地运行: 条件? first _ expression: second _ expression;

Convert.IsDBNull (rsData [“ usr.urrdaystime”]) ? Convert.ToString (rsData [“ usr.urrdaystime”]) : null

There is still such an alternative option:

strLevel = rsData.GetValue(0) is DBNull? "" : rsData.GetString(0);

You need to know exactly which column counts.

Just simply check

String val = string.IsNullOrEmpty (rsData [“ usr.urrdaystime”] ?”: rsData [“ usr.urrdaystime”] . ToString ())

我知道这是一个10多年前的问题,但是我碰巧遇到了这个问题,最近在一个。Net 6应用程式使用「 Microsoft。百科。“ SqlClient”Version = “5.0.0-preview2.22096.2”,使用 DataTableReader

You'll want to use the reader's built-in IsDBNull method to test a value before retrieving it, because the implicit (or explicit) cast from using any of the Get* functions may throw an exception (varies on type)

因此,对于一个线性-if 解,下面是 BAD: 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年有所帮助:)