2017-07-20 5 views
0

Ich muss einen Parameter in einem SqlCommand füllen, aber für einige Bedingungen möchte ich es mit DBNull.Value und sonst mit einem Wert füllen.Verwenden eines ternären Operators, um einen SqlCommand Parameter zu füllen

Was ich brauche ist, dass, wenn die Variable truckID == -1 dann DBNull.Value in den Parameter setzen, sonst setzen Sie den Wert von truckID drin.

Dies ist, was ich versucht habe:

using (SqlCommand command = new SqlCommand(sql.ToString())) 
{ 
    command.CommandType = CommandType.Text; 
    command.Parameters.AddWithValue("@TruckID", truckID == -1 ? DBNull.Value : truckID); 

aber der Compiler sagt mir:

Fehler CS0173 Art des bedingten Ausdrucks nicht bestimmt werden kann, weil es keine implizite Konvertierung zwischen ‚System.DBNull ist 'und 'int'

Wenn ich schreiben würde dies:

command.Parameters.AddWithValue("@TruckID", truckID == -1 ? 0 : truckID); 

dann ist der Compiler glücklich. So scheint es, dass für einen ternären Operator beide möglichen Werte vom gleichen Typ sein müssen.

Was wäre der beste Weg, dies zu tun?

EDIT:

der Arbeits Code für mich ist dies:

command.Parameters.Add 
    (new SqlParameter("@TruckID", SqlDbType.Int).Value = (import.TruckID == -1) ? (object)DBNull.Value : import.TruckID); 

EDIT:
Eigentlich oberhalb der Code nicht, nachdem alle nicht funktioniert.
Zur Laufzeit bekam ich dies:

SqlParameterCollection akzeptiert nur Nicht-Null-SqlParameter Typ Objekte, nicht DBNull Objekte

Also habe ich den Code dieses modifizierte und das ist für mich endlich geklappt.

command.Parameters.Add 
    (new SqlParameter("@PlaceID", SqlDbType.Int) { Value = (import.TruckID == -1) ? (object)DBNull.Value : import.TruckID }); 
+1

Ist eine regelmäßige ol ''if' Anweisung so eine schlechte Idee hier? – maccettura

+0

Sie müssen vom selben Typ sein oder implizit konvertiert werden (IIRC). Teilen Sie es einfach in tatsächliche if-Anweisungen auf. –

+1

'LKWId == -1? (Objekt) DBNull.value: truckID'. Und verwenden Sie nicht '' AddWithValue' '(https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/). –

Antwort

1

Sie mögen diese Version

SqlParameter param = new SqlParameter("@truckID", System.Data.SqlDbType.Int) 
          { Value = (truckID == -1) ? (object)DBNull.Value : truckID }; 
command.Parameters.Add(param); 

Eine andere Version wäre

SqlParameter param = new SqlParameter("@truckID", System.Data.SqlDbType.Int); 
param.Value = (truckID == -1) ? DBNull.Value : truckID; 
command.Parameters.Add(param); 

Nun Motto versuchen:

SqlParameter param = (truckID == -1) ? 
         new SqlParameter("@truckID", System.Data.SqlDbType.Int) { Value = DBNull.Value } 
         : new SqlParameter("@truckID", System.Data.SqlDbType.Int) { Value = truckID }; 
command.Parameters.Add(param); 
+0

Ja, aber ich möchte es auf einer Zeile Code halten – GuidoG

+0

OK, das ist, was ich brauche, danke ich habe nur die erste Zeile als Parameter für die Parameter.add() – GuidoG

+0

@GuidoG Hat das funktioniert? Es sollte das gleiche Problem haben, das Sie ursprünglich hatten und zusätzlich sieht die Einliner-Version sehr seltsam für mich aus. Das sollte nicht kompilieren. Es sollte in etwa so aussehen: 'SqlParameter param = neuer SqlParameter (" @ truckID ", System.Data.SqlDbType.Int) {Wert = (truckID == -1)? (Objekt) DBNull.Value: truckID}; –

1

könnten Sie werfen explizit DBNull.Value zum Objekt:

command.Parameters.AddWithValue("@TruckID", truckID == -1 ? (object)DBNull.Value : truckID); 
+0

Danke funktioniert – GuidoG

Verwandte Themen