簡體   English   中英

DBNull if 語句

[英]DBNull if statement

我正在嘗試執行一個存儲過程,然后使用 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# 正確執行此操作

If Not 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

與您的 VB 最接近的等價物是( 請參閱此):

Convert.IsDBNull()

但是有很多方法可以做到這一點,大多數都從這里鏈接

是的,只是語法問題。 試試這個:

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 ;p

我經常使用 String.IsNullorEmpty。 這對她有用,因為當 DBNull 設置為 .ToString 時,它返回空。

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

三元運算符在這里應該做得很好:條件? 第一個表達式:第二個表達式;

strLevel = !Convert.IsDBNull(rsData["usr.ursrdaystime"]) ? Convert.ToString(rsData["usr.ursrdaystime"]):空

仍然有這樣的替代選擇:

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

您需要確切知道哪些列很重要。

只需檢查

字符串 val= string.IsNullOrEmpty(rsData["usr.ursrdaystime"]?"":rsData["usr.ursrdaystime"].ToString())

我知道這是一個 10 多年前的問題,但我碰巧遇到了這個問題,最近正在使用“Microsoft.Data.SqlClient”Version="5.0.0-preview2.22096.2" 在 .Net 6 應用程序中調試一個強制轉換 SQL 空問題, 使用 DataTableReader

您需要使用閱讀器的內置 IsDBNull 方法在檢索值之前對其進行測試,因為使用任何 Get* 函數的隱式(或顯式)強制轉換可能會引發異常(因類型而異)

因此,對於 line-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 年有所幫助:)

起初使用 ExecuteScalar

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM