addwithvalue c# .net ado.net

c# - Excepción cuando el parámetro AddWithValue es NULL



parameters addwithvalue null (5)

Crea una clase estática como esta:

public static class Extensions { public static string RemoveNulls(this string container) { if (container == null) container = ""; return container; } }

Luego en tu código, haz esto:

Parameters.AddWithValue(sName, Value.RemoveNulls());

Esto es a prueba de balas y muy fácil de usar

Tengo el siguiente código para especificar parámetros para la consulta SQL. Estoy obteniendo la siguiente excepción cuando uso el Code 1 ; pero funciona bien cuando uso el Code 2 . En el Code 2 tenemos una comprobación de nulo y, por lo tanto, un bloque if..else .

Excepción:

La consulta parametrizada ''(@application_ex_id nvarchar (4000)) SELECT E.application_ex_id A'' espera el parámetro ''@application_ex_id'', que no se suministró.

Código 1 :

command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);

Código 2 :

if (logSearch.LogID != null) { command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID); } else { command.Parameters.AddWithValue("@application_ex_id", DBNull.Value ); }

PREGUNTA

  1. ¿Puede explicar por qué no puede tomar NULL del valor logSearch.LogID en el Código 1 (pero puede aceptar DBNull)?

  2. ¿Hay un código mejor para manejar esto?

Referencia :

  1. Asignar nulo a un parámetro SqlParameter
  2. El tipo de datos devuelto varía según los datos de la tabla
  3. Error de conversión de la base de datos smallint en C # nullable int
  4. ¿Cuál es el punto de DBNull?

CÓDIGO

public Collection<Log> GetLogs(LogSearch logSearch) { Collection<Log> logs = new Collection<Log>(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string commandText = @"SELECT * FROM Application_Ex E WHERE (E.application_ex_id = @application_ex_id OR @application_ex_id IS NULL)"; using (SqlCommand command = new SqlCommand(commandText, connection)) { command.CommandType = System.Data.CommandType.Text; //Parameter value setting //command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID); if (logSearch.LogID != null) { command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID); } else { command.Parameters.AddWithValue("@application_ex_id", DBNull.Value ); } using (SqlDataReader reader = command.ExecuteReader()) { if (reader.HasRows) { Collection<Object> entityList = new Collection<Object>(); entityList.Add(new Log()); ArrayList records = EntityDataMappingHelper.SelectRecords(entityList, reader); for (int i = 0; i < records.Count; i++) { Log log = new Log(); Dictionary<string, object> currentRecord = (Dictionary<string, object>)records[i]; EntityDataMappingHelper.FillEntityFromRecord(log, currentRecord); logs.Add(log); } } //reader.Close(); } } } return logs; }


En caso de que esté haciendo esto mientras llama a un procedimiento almacenado: creo que es más fácil de leer si declara un valor predeterminado en el parámetro y lo agrega solo cuando es necesario.

Por ejemplo: (sql)

DECLARE PROCEDURE myprocedure @myparameter [int] = NULL AS BEGIN

(do#)

int? myvalue = initMyValue(); if (myvalue.hasValue) cmd.Parameters.AddWithValue("myparamater", myvalue);

Sé que esto es viejo, pero me parece útil y quería compartirlo.


Me resulta más fácil escribir un método de extensión para SqlParameterCollection que maneja valores nulos:

public static SqlParameter AddWithNullableValue( this SqlParameterCollection collection, string parameterName, object value) { if(value == null) return collection.AddWithValue(parameterName, DBNull.Value); else return collection.AddWithValue(parameterName, value); }

Entonces solo lo llamas como

sqlCommand.Parameters.AddWithNullableValue(key, value);


Molesto, ¿no es así?

Puedes usar:

command.Parameters.AddWithValue("@application_ex_id", ((object)logSearch.LogID) ?? DBNull.Value);

O alternativamente, use una herramienta como "dapper", que hará todo ese lío por usted.

Por ejemplo:

var data = conn.Query<SomeType>(commandText, new { application_ex_id = logSearch.LogID }).ToList();

Estoy tentado a agregar un método para dapper para obtener el IDataReader ... aún no estoy seguro de si es una buena idea.


algún problema, permitido con Necesario establecer SQLDbType

command.Parameters.Add("@Name", SqlDbType.NVarChar); command.Parameters.Value=DBNull.Value

donde escribe SqlDbType.NVarChar. Necesariamente establecer el tipo de SQL. Enjou