C # -Äquivalent der IsNull () -Funktion in SQL Server


112

In SQL Server können Sie mit der IsNull()Funktion überprüfen, ob ein Wert null ist, und wenn dies der Fall ist, einen anderen Wert zurückgeben. Jetzt frage ich mich, ob es in C # etwas Ähnliches gibt.

Zum Beispiel möchte ich etwas tun wie:

myNewValue = IsNull(myValue, new MyValue());

anstatt:

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

Vielen Dank.

Antworten:


203

Es heißt null coalescing ( ??) Operator:

myNewValue = myValue ?? new MyValue();

3
Ich habe versucht, den Null-Koaleszenz-Operator zu verwenden, habe aber immer wieder den Fehler Operator '??' erhalten. kann nicht auf Operanden vom Typ 'bool?' angewendet werden. und 'int' . Der Fehler war irreführend. Das Problem war, dass ich versuchte, einer booleschen Variablen ein int an der rechten Operandenposition zuzuweisen. Ich musste ändern von this.BinaryExists = vModel.BinaryExists ?? 0;zu this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Leider gibt es kein Äquivalent zum Null-Koaleszenz-Operator, der mit DBNull funktioniert. Dazu müssen Sie den ternären Operator verwenden:

newValue = (oldValue is DBNull) ? null : oldValue;

15
Nitpick: Ich weiß, dass viele Orte dies als ternären Operator bezeichnen. Momentan gibt es nur einen ternären Operator, aber das ist eine Eigenschaft davon, nicht sein Name. Es ist wirklich der bedingte Operator. Wenn C # jemals einen anderen ternären Operator gewinnt, wird es viele verwirrende Bücher geben.
Jon Skeet

Sie können dbnull in ein Objekt ((Objekt) oldValue ?? (Objekt) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)wäre gleichbedeutend mit ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValuedem Problem, mit dem sich Robert Rossneys Lösung befasst.
Trisped

5
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

Auf diese Weise new MyValue()wird das ausgeführt, auch wenn myValuees nicht null ist und nicht erforderlich ist !!
Serpooshan

4

Verwenden Sie die Equals-Methode:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));

Diese Antwort gibt nur True oder False zurück, was vom OP nicht verlangt wurde.
Culme

1

Für die Arbeit mit DB Nulls habe ich eine Reihe für meine VB-Anwendungen erstellt. Ich nenne sie Cxxx2, da sie den in CB integrierten Cxxx-Funktionen ähnlich sind.

Sie können sie in meinem CLR-Erweiterungsprojekt sehen

http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967


Sieht so aus, als hätten sie alle URLs in CodePlex geändert. Versuchen Sie dies: clrextensions.codeplex.com/SourceControl/changeset/view/…
Jonathan Allen

0

Sie schreiben zwei Funktionen

    //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;
        }
    }

Sie funktionieren sehr gut


2
Dieses Codefragment kann das Problem zwar lösen, erklärt jedoch nicht, warum oder wie es die Frage beantwortet. Bitte geben Sie eine Erklärung für Ihren Code an , da dies wirklich zur Verbesserung der Qualität Ihres Beitrags beiträgt. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Flagger / Rezensenten: Für Nur-Code-Antworten wie diese, Downvote, nicht löschen!
Luca Kiebel

0

Ich habe die folgende Erweiterungsmethode für meine DataRow-Typen verwendet:

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

Verwendung:

MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");

Ich überprüfe zuerst, ob die Spalte vorhanden ist, da das DataTable-Objekt diese Spalte nicht einmal bereitstellt, wenn keines der Abfrageergebnisse einen Wert ungleich Null für diese Spalte aufweist.


0

Verwenden Sie die folgenden Methoden.

    /// <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;
    }

0
    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

Dies ist halb als Scherz gedacht, da die Frage irgendwie albern ist.

public static bool IsNull (this System.Object o)
{
   return (o == null);
}

Dies ist eine Erweiterungsmethode, die jedoch System.Object erweitert, sodass jedes von Ihnen verwendete Objekt jetzt über eine IsNull () -Methode verfügt.

Dann können Sie Tonnen von Code speichern, indem Sie Folgendes tun:

if (foo.IsNull())

anstelle des super lahmen:

if (foo == null)

Dies beantwortet die Frage nicht.
Eric Schoonover

12
Sie wissen nicht, was ISNULL in SQL Server macht, FlySwat.
ClayKaboom

1
Vielleicht funktioniert dies in C # anders, aber ich weiß, dass dies in VB NICHT zum Testen des Objekts funktionieren würde. Es ist null, nach dem das OP fragt. Ich habe es selbst versucht. Ich habe eine solche Erweiterung für System.Object vorgenommen. Das Problem ist, dass für die Erweiterungsmethode ein tatsächliches ObjectObjekt erforderlich ist, auf dem gearbeitet werden soll. Wenn das Objekt Nothing war (genau der Fall, auf den Sie in diesem Q testen möchten), gab es keine Instanz, auf der die Erweiterungsklasse ausgeführt werden konnte, und dies würde auch der Fall sein eine NullObject-Ausnahme auslösen.
Eidylon

@eidylon Sieht so aus, als könnten Sie Objectin VB nicht auf eine Erweiterungsmethode zugreifen . Siehe diese SO-Frage oder diesen Blog-Beitrag .
Trisped
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.