[英]c# datarow comparing DBNull.Value for DateTime vs null for string
[英]C#/Oracle10g = null vs DBNull.Value vs String.Empty
我正在首次嘗試從C#訪問Oracle。 我發現Oracle不喜歡VarChar
參數的值為null
(C#)。 我希望會有一些隱含的轉換,但我很欣賞它的區別。
所以我需要捕獲這些空值並提供DBNull.Value
,當然? 最明顯的方法是使用合並算子??
:
param myParm = myObject.MyProperty ?? DBNull.Value;
除了它不接受System.DBNull
的值...所以我必須使用:
param myParm = myObject.MyProperty ?? DBNull.Value.ToString();
......這肯定是一樣的:
param myParm = myObject.MyProperty ?? String.Empty;
..哪個也有效。
但我總是明白,根據ANSI SQL規則,空字符串(“”)!= NULL值......但它似乎在Oracle中。
無論如何,我的問題是,處理空字符串值的情況的最佳,實用或理論方法是什么? 有沒有一個我沒有發現的光滑替代品? 或者這只是我們接受的Oracle的另一個特質?
空字符串(“”)如果事實上不等於NULL值,那是因為NULL不等於任何東西(甚至不是另一個NULL)(這就是為什么你在SQL語句中說IS NULL
而不是= NULL
。
NULL表示“無值”,空字符串沒有值,因此Oracles設計者認為空字符串和NULL之間沒有區別。
param myParm = myObject.MyProperty ?? DBNull.Value;
失敗,因為兩側??
必須是同一類型。 MyProperty
我假設是一個字符串,而DBNull.Value
是一個DBNull
對象。
這里有一個更簡單的解決方案,因為??
將無法正常工作, String.Empty
將無法用於您的null值。
param myParm;
if (myObject.MyProperty == null)
{
myParm = DBNull.Value;
}
else
{
myParm = myObject.MyProperty;
}
它可能不像null-coalescer那樣'光滑',但它應該有效。
如果將該值設置為null
,則.NET將不會在生成的SQL中指定該參數。 因此,一個選項是為Oracle中的參數指定默認值NULL
。 這意味着將值設置為null
或DBNull.Value
具有相同的效果。 一個沒有傳遞值,將假定為NULL
,而另一個顯式傳遞NULL
。
顯然,假設您可以修改數據庫,並且您還不需要為該參數設置不同的默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.