2017-03-09 2 views
1

Ich bin ein wenig festgefahren, auch wenn ich Fragen über Null und Datenbanken gelesen habe. Ich versuche herauszufinden, wie ich NULL an die Datenbank C# senden kann. Verfahren singature istNULL-Wert in TSQL-Datenbank einfügen

MyMethod(string category, int? calories, int vegetarianFriendlyMeal); 

, wenn sie mit nicht null genannt int es in Ordnung ist, aber wenn ich pass null es sagt.

Die SqlCommand.Prepare-Methode erfordert, dass alle Parameter einen explizit festgelegten Typ aufweisen.

Würdest du mir bitte sagen, wie man das Übergeben einer Null an die Datenbank zulässt und den folgenden Code explizit eingibt? Vielen Dank.

  command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
      command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
      if (calories == null) 
      { 
       command.Parameters.AddWithValue("@calories", DBNull.Value); 
      } 
      else 
      { 
       command.Parameters.Add("@calories", SqlDbType.Int).Value = calories; 
      } 

Ich habe auch versucht,

SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories); 
command.Parameters.Add(cal); 

mit dem gleichen Ergebnis.

+1

Mit '.Value = Kalorien ?? (Objekt) DBNull.Value; 'sollte gut funktionieren. Der einzige Unterschied ist der Wert. Warum erstellen Sie den Parameter auf zwei verschiedene Arten? – Luaan

+0

Sind Sie sicher, dass dies der gesamte Code ist? Ich sehe auf den ersten Blick keine Probleme. Gibt es andere Parameter in der Abfrage? – Andrey

+0

@Luaan Danke, das funktioniert auch und speichert die if-Anweisung. – Bendom

Antwort

1

Haben Sie versucht:

cmd.Parameters.Add("@calories", System.Data.SqlDbType.Int).Value = DBNull.Value;

+0

Das funktioniert ganz gut. Vielen Dank. – Bendom

1

Die Lösung hier ist einfach. In Fall 1 kann .NET unter Verwendung von AddWithValue nicht den zugehörigen Typ DBNull.Value ableiten. Die Lösung von Fall 1 ist:

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
if (calories == null) 
{ 
    command.Parameters.Add("@calories", SqlDbType.Int).Value = (object)DBNull.Value; 
} 
else 
{ 
    command.Parameters.Add("@calories", SqlDbType.Int).Value = calories; 
} 

In Fall 2 geben Sie überhaupt keinen Typ an. Die Lösung wäre:

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories); 
cal.DbType = SqlDbType.Int; 
command.Parameters.Add(cal); 

Aber wenn Sie es machen wollen, reinigen Sie so etwas tun:

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
command.Parameters.Add("@calories", SqlDbType.Int).Value = calories ?? (object)DBNull.Value; 

EDIT: Nicht AddWithValue verwenden. Es ist riskant, dass .NET Löcher für Sie füllt.

+0

Vielen Dank auch. Ich gehe normalerweise mit .Add, aber hier war ich fest und hoffte, dass. AddWithValue wird das für mich lösen. – Bendom