2009-07-30 19 views
45

Im llamar a un procedimiento almacenado de SQL de un trozo de código C# .NET:Cómo pasar una variable nula a un procedimiento almacenado de SQL de código C# .NET

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

donde la variable sqlParameters se define como:

 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; 

necesito pasar ahora en otros dos parámetros a este procedimiento almacenado, (ambos son de tipo SqlDateTime), que se va a NULL en este caso.

Gracias,

EN

Respuesta

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

... luego copia para el segundo.

9

puede pasar el DBNull.Value en propiedad .Value del parámetro:

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

Sólo ajustar para sus dos parámetros de fecha y hora, obviamente, - sólo mostrar cómo utilizar el DBNull.Value valor de la propiedad aquí.

Marc

23

Uso DBNull.Value Mejor aún, hacer que sus parámetros de procedimiento almacenado tienen valores por defecto de NULL. O utilizar un parámetro Nullable<DateTime> si el parámetro a veces será un objeto DateTime válido

+2

Obtiene un +1 por ser la primera persona en mencionar el parámetro predeterminado para la posibilidad de proceso almacenado. – 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

utilizo un método para convertir a DBNull si es nula

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

Así que al establecer el parámetro, simplemente llame a la función

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

Esto asegurará cualquier nulos, cambiarse a DBNull.Value, de lo contrario seguirá siendo el mismo.

+1

que de buena solución i cambiado método estático al método de extensión para los objetos 'pública objeto ToDbNull estática (este valor objetivo) { si (nulo!= valor) valor de retorno; return DBNull.Value; } ' – Gayan

+0

Excepto que un DateTime no es un tipo anulable, por lo que esto no funcionará para DateTime (como se especifica en la pregunta) ni para ningún otro tipo de valor que no admite valores, a menos que declare que todos los valores son Nullable que no parece ser un enfoque particularmente bueno. –

+0

@MayorBoris Usar entidad marco. Mucho mejor. – Doomsknight

0

intente esto! sintaxis menos líneas y aún más compacto! ¡no olvide agregar las propiedades que desea agregar con este enfoque!

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

Digamos que el nombre del parámetro es "ID" del procedimiento de SQL almacenado y la función de C# que utiliza para llamar al procedimiento almacenado es la base de datos Nombre del tipo int?. Teniendo en cuenta que, tras podría resolver el problema:

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

vieja pregunta, pero aquí es una manera bastante limpio para crear un parámetro anulable:

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

Si request.body tiene un valor, entonces su valor es usado. Si es nulo, entonces se usa DbNull.Value.

Cuestiones relacionadas