[英]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
。
考慮:
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
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 = !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.