2012-03-01 13 views
7

Estoy rellenando tablas utilizando un procedimiento almacenado. La tabla permite un 'nulo' para la primera mitad del nombre, pero estoy recibiendo el mensaje de error:C# ASP.Net Parámetros.AddWithValue que rechaza el valor nulo para el parámetro

procedimiento o función 'uspInsertPersonalAccountApplication' espera el parámetro '@MiddleInitial', que no fue suministrada.

¡Gracias de antemano!

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 

Respuesta

4

Hay dos opciones aquí:

que modifique procedimiento almacenado y crea @MiddleInitial parámetro opcional (que actualmente no está opcional es por eso que se arroja el error)

@MiddleInitial nvarchar(10) = NULL 

O añadir siguiente línea a su código:

cmd.Parameters.AddWithValue("@MiddleInitial", null); 
+1

Paso en 53 parámetros, muchos de los cuales pueden ser nulos. ¿Cómo puedo establecer dinámicamente DBNull.Value sin ajustar cada asignación en una instrucción IF? – Susan

+1

Si es posible modificar el procedimiento almacenado, modifique los parámetros que pueden ser nulos y que sean opcionales en la declaración del procedimiento almacenado. Esa es la solución más flexible.Si esto no es posible, puede usar 'SqlCommandBuilder.DeriveParameters (comando);' y establecer 'DBNull.Value' para cada uno de ellos en bucle. Y luego asigna los que quieras. – Marcin

+2

Consulte los comentarios en http://stackoverflow.com/a/9518215/8479: use 'cmd.ParametersAddWithValue (" @ MiddleInitial ", (object) yourVal ?? DBNull.Value);' o agregue un método de extensión como 'AddParamWithValueOrNull () ' – Rory

3

tratar de pasar en vez de DBNull.Valuenull.

+0

Estoy pasando en 53 parámetros, muchos de los cuales pueden ser nulos. ¿Cómo puedo establecer dinámicamente DBNull.Value sin ajustar cada asignación en una instrucción IF? – Susan

+1

Añadir '?? DBNull.Value' después del valor, o crea una función como 'AddValueWithNonNullParameter' que lo hace por ti – Andomar

+0

¿Te gusta? Intellisense me está dando un error e Intellisense no reconoce AddValueWithNullParameter ------- cmd.Parameters.AddWithValue ("@ MiddleInitial", InputData [11] ?? DBNull.Value); – Susan

0

añadir el parámetro para MiddleInitial también con valor nulo

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
1

Es necesario declarar en todo - incluso si es nulo.

Utilice DBNull.Value para MiddleInitial.

cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
0

oye usted tiene que fijar con el procedimiento de almacenamiento

@MiddleInitial varhcar(8) = null 
+0

+1 Esto funcionaría realmente ya que el parámetro se convierte en opcional – Andomar

5

Usted puede agregar a proyectar y el uso siguiente método de extensión:

public static SqlParameter AddWithValueSafe(this SqlParameterCollection parameters, string parameterName, object value) 
{ 
    return parameters.AddWithValue(parameterName, value ?? DBNull.Value); 
} 
1

creé un método de extensión para combatir este problema. La sugerencia de Marcin también vale la pena considerar si puede actualizar el procedimiento almacenado.

cmd.Parameters.AddString("@MyParamName", myValue); 


public static class SQLExtension 
{ 
    public static void AddString(this SqlParameterCollection collection, string parameterName, string value) 
    { 
     collection.AddWithValue(parameterName, ((object)value) ?? DBNull.Value); 
    } 
} 
Cuestiones relacionadas