C# 等效于 SQL Server 中的 IsNull() 函数
Posted
技术标签:
【中文标题】C# 等效于 SQL Server 中的 IsNull() 函数【英文标题】:C# equivalent of the IsNull() function in SQL Server 【发布时间】:2010-09-15 05:10:15 【问题描述】:在 SQL Server 中,您可以使用IsNull()
函数来检查一个值是否为空,如果是,则返回另一个值。现在我想知道 C# 中是否有类似的东西。
例如,我想做这样的事情:
myNewValue = IsNull(myValue, new MyValue());
代替:
if (myValue == null)
myValue = new MyValue();
myNewValue = myValue;
谢谢。
【问题讨论】:
【参考方案1】:称为空合并 (??
) 运算符:
myNewValue = myValue ?? new MyValue();
【讨论】:
我尝试使用空合并运算符,但一直收到错误 Operator '??'不能应用于“bool”类型的操作数?和'int'。该错误具有误导性。问题是我试图将右侧操作数位置的 int 分配给布尔变量。我不得不从this.BinaryExists = vModel.BinaryExists ?? 0;
更改为 this.BinaryExists = vModel.BinaryExists ?? false;
。【参考方案2】:
遗憾的是,没有等效于与 DBNull 一起使用的空合并运算符;为此,您需要使用三元运算符:
newValue = (oldValue is DBNull) ? null : oldValue;
【讨论】:
Nitpick:我知道很多地方都将其称为三元运算符。目前恰好只有一个三元运算符,但这是它的属性,而不是它的名称。它实际上是条件运算符。如果 C# 再获得一个三元运算符,那将会有很多令人困惑的书籍。 您可以将 dbnull 强制转换为对象 ((object)oldValue ?? (object)DBNull.Value)) @JeremyGray(object)oldValue ?? (object)DBNull.Value)
等同于 ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValue
,这与 Robert Rossney 的解决方案解决的问题不同。【参考方案3】:
public static T isNull<T>(this T v1, T defaultValue)
return v1 == null ? defaultValue : v1;
myValue.isNull(new MyValue())
【讨论】:
这样,new MyValue()
将被执行,即使myValue
不为空且不需要它!【参考方案4】:
使用 Equals 方法:
object value2 = null;
Console.WriteLine(object.Equals(value2,null));
【讨论】:
这个答案只返回 True 或 False,这不是 OP 要求的。【参考方案5】:为了使用 DB Nulls,我为我的 VB 应用程序创建了一堆。我称它们为 Cxxx2,因为它们类似于 VB 的内置 Cxxx 函数。
您可以在我的 CLR 扩展项目中看到它们
http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967
【讨论】:
看起来他们更改了 CodePlex 上的所有 URL。试试这个:clrextensions.codeplex.com/SourceControl/changeset/view/…【参考方案6】:你写了两个函数
//When Expression is Number
public static double? isNull(double? Expression, double? Value)
if (Expression ==null)
return Value;
else
return Expression;
//When Expression is string (Can not send Null value in string Expression
public static string isEmpty(string Expression, string Value)
if (Expression == "")
return Value;
else
return Expression;
他们工作得很好
【讨论】:
虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。 举报者/评论者: For code-only answers such as this one, downvote, don't delete!【参考方案7】:我一直在我的 DataRow 类型上使用以下扩展方法:
public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
string val = defaultValue;
if (row.Table.Columns.Contains(colName))
if (row[colName] != DBNull.Value)
val = row[colName]?.ToString();
return val;
用法:
MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");
我首先检查该列是否存在,因为如果没有任何查询结果具有该列的非空值,则 DataTable 对象甚至不会提供该列。
【讨论】:
【参考方案8】:使用以下方法。
/// <summary>
/// Returns replacement value if expression is null
/// </summary>
/// <param name="expression"></param>
/// <param name="replacement"></param>
/// <returns></returns>
public static long? IsNull(long? expression, long? replacement)
if (expression.HasValue)
return expression;
else
return replacement;
/// <summary>
/// Returns replacement value if expression is null
/// </summary>
/// <param name="expression"></param>
/// <param name="replacement"></param>
/// <returns></returns>
public static string IsNull(string expression, string replacement)
if (string.IsNullOrWhiteSpace(expression))
return replacement;
else
return expression;
【讨论】:
【参考方案9】: public static T IsNull<T>(this T DefaultValue, T InsteadValue)
object obj="kk";
if((object) DefaultValue == DBNull.Value)
obj = null;
if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
return InsteadValue;
else
return DefaultValue;
//This method can work with DBNull and null value. This method is question's answer
【讨论】:
【参考方案10】:这只是一个玩笑,因为这个问题有点傻。
public static bool IsNull (this System.Object o)
return (o == null);
这是一个扩展方法,但是它扩展了 System.Object,因此您现在使用的每个对象都有一个 IsNull() 方法。
然后您可以通过以下方式节省大量代码:
if (foo.IsNull())
而不是超级跛脚:
if (foo == null)
【讨论】:
这没有回答问题。 你不知道sql server中的ISNULL是做什么的,FlySwat。 也许这在 C# 中的工作方式不同,但我知道在 VB 中这不适用于测试对象是否为空,因为 OP 正在询问。我自己试过这个。我对 System.Object 做了这样的扩展。问题是扩展方法需要一个实际的Object
对象来操作,如果该对象是 Nothing (正是你试图在这个 Q 中测试的情况),那么扩展类没有实例可以操作并且因此它会抛出一个 NullObject 异常。
@eidylon 看起来您无法在 VB 中访问 Object
上的扩展方法。请参阅this SO question 或this blog post。以上是关于C# 等效于 SQL Server 中的 IsNull() 函数的主要内容,如果未能解决你的问题,请参考以下文章
C# long 类型的等效 SQL Server 类型是啥?
MySQL MATCH() AGAINST() 等效于 SQL Server
等效于 SQL SERVER 的 MySQL LIMIT 子句
C# 的哪种数据类型相当于 SQL Server 中的钱? [复制]
SQL Server 2008 中的 SQL Server 2008 R2 中的 dm_os_volume_stats 等效项是啥?