簡體   English   中英

C#/ Oracle10g = null vs DBNull.Value vs String.Empty

[英]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 這意味着將值設置為nullDBNull.Value具有相同的效果。 一個沒有傳遞值,將假定為NULL ,而另一個顯式傳遞NULL

顯然,假設您可以修改數據庫,並且您還不需要為該參數設置不同的默認值。

暫無
暫無

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

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