2009-07-30 17 views
45

Im wywołanie SQL procedury przechowywanej z kawałka kodu C# .NET:Jak przekazać zmienną zerowej do SQL procedura przechowywana z C# kodu .NET

SqlHelper.ExecuteDataset(sqlConnection, CommandType.StoredProcedure, STORED_PROC_NAME, sqlParameters); 

gdzie zmienna sqlParameters jest zdefiniowany jako:

 SqlParameter[] sqlParameters = new SqlParameter[SQL_NUMBER_PARAMETERS]; 

     Log.Logger.Debug(string.Format("Running proc: {0} ", STORED_PROC_NAME)); 

     SqlParameters[0] = new SqlParameter("fieldID", SqlDbType.BigInt); 
     SqlParameters[0].Value = fieldID; 
     SqlParameters[0].Direction = ParameterDirection.Input; 

muszę teraz przejść w kolejne dwa parametry do tej przechowywanej proc, (oba są typu SqlDateTime), który zamierzamy NULL w tym przypadku.

Dzięki,

IN

Odpowiedz

63
SqlParameters[1] = new SqlParameter("Date1", SqlDbType.SqlDateTime); 
SqlParameters[1].Value = DBNull.Value; 
SqlParameters[1].Direction = ParameterDirection.Input; 

... skopiuj na sekundę.

9

możesz przekazać DBNull.Value we własność .Value parametru:

SqlParameters[0] = new SqlParameter("LedgerID", SqlDbType.BigInt); 
    SqlParameters[0].Value = DBNull.Value; 

Wystarczy dostosować do swoich dwóch parametrów DateTime, oczywiście - tylko pokazuje, jak używać DBNull.Value wartość właściwości tutaj.

Marc

23

Użyj DBNull.Value Lepiej, aby parametry procedury składowanej miały domyślne wartości NULL. Lub użyj parametru Nullable<DateTime> jeśli parametr będzie czasami ważny obiekt DateTime

+2

Otrzymujesz +1 za to, że jako pierwsza osoba wymieniła domyślny parametr dla przechowywanej możliwości procesu. – Beska

0
SQLParam = cmd.Parameters.Add("@RetailerID", SqlDbType.Int, 4) 
    If p_RetailerID.Length = 0 Or p_RetailerID = "0" Then 
     SQLParam.Value = DBNull.Value 
    Else 
     SQLParam.Value = p_RetailerID 
    End If 
7

używam metody konwersji do DBNull jeśli jest null

// Converts to DBNull, if Null 
    public static object ToDBNull(object value) 
    { 
     if (null != value) 
      return value; 
     return DBNull.Value; 
    } 

Więc gdy ustawienie parametru, po prostu zadzwonić do funkcja

sqlComm.Parameters.Add(new SqlParameter("@NoteNo", LibraryHelper.ToDBNull(NoteNo))); 

Zapewni to wszelkie wartości zerowe, zostanie zmienione na DBNull.Value, w przeciwnym razie pozostanie bez zmian.

+1

To dobre rozwiązanie. Zmieniłem metodę statyczną na metodę rozszerzającą dla obiektów publicznych public object ToDbNull (ta wartość obiektu) { if (null!= wartość) wartość zwracana; return DBNull.Value; } ' – Gayan

+0

Poza tym, że DateTime nie jest typem zerowalnym, więc nie będzie działać dla DateTime (jak określono w pytaniu) lub dla jakichkolwiek innych nie-nullowych typów wartości, chyba że zadeklarujesz, że wszystkie twoje vary są Nullable co nie wydaje się szczególnie dobrym podejściem. –

+0

@MayorBoris Użyj struktury encji. O wiele lepiej. – Doomsknight

0

wypróbuj to! Składaj mniej linii i jeszcze bardziej kompaktowy! nie zapomnij dodać właściwości, które chcesz dodać za pomocą tego podejścia!

cmd.Parameters.Add(new SqlParameter{SqlValue=(object)username??DBNull.Value,ParameterName="user" } ); 
0

Powiedzmy nazwa parametru jest „ID” w procedurze SQL przechowywane, a funkcja C# używasz zadzwonić procedura baza danych przechowywana jest nazwa typu int?. Biorąc pod uwagę, że w następstwie może rozwiązać swój problem:

public void storedProcedureName(Nullable<int> id, string name) 
{ 
    var idParameter = id.HasValue ? 
       new SqlParameter("Id", id) : 
       new SqlParameter { ParameterName = "Id", SqlDbType = SqlDbType.Int, Value = DBNull.Value }; 

    // to be continued... 
1

Stare pytanie, ale tutaj jest dość czysty sposób utworzyć zerowalne parametr:

new SqlParameter("@note", (object) request.Body ?? DBNull.Value); 

Jeśli request.Body ma wartość, to jest wartość nie jest używany. Jeśli ma wartość NULL, używana jest wartość DbNull.Value.

Powiązane problemy