2011-03-18 20 views
22

que estaba haciendo algo como esto:SqlParameter con el valor predeterminado se establece en 0 no funciona como se esperaba

SqlParameter param = new SqlParameter("@Param", 0) { SqlDbType = SqlDbType.Int }; 

private void TestParam(SqlParameter param) { 
    string test = param.Value.ToString(); // Getting NullReferenceException here 
} 

Pero dejar de recibir la excepción cuando lo pongo de esta manera:

SqlParameter param = new SqlParameter("@Param", SqlDbType.Int) { Value = 0 }; 

private void TestParam(SqlParameter param) { 
    string test = param.Value.ToString(); // Everything OK 
} 

¿Alguien puede decirme por qué SqlParameter supone que 0 es lo mismo que nulo?

Editar: MSDN explica aquí: SqlParameter Constructor

+4

Bien, se explica aquí: http://msdn.microsoft.com/en-us/library/0881fz2y%28v=VS.80%29.aspx Al crear un nuevo SqlParameter con el valor predeterminado "0", necesita convertirlo explícitamente a entero. De lo contrario, se supone que está pasando una enum SqlDbType como el segundo parámetro. – Meryovi

Respuesta

38

Uso precaución cuando se utiliza esta sobrecarga del constructor SqlParameter a especificar valores de los parámetros enteros. Dado que esta sobrecarga toma un valor de tipo Objeto, debe convertir el valor integral en un tipo de Objeto cuando el valor sea cero, como lo demuestra el siguiente ejemplo de C# .

Parameter = new SqlParameter("@pname", Convert.ToInt32(0)); 

Si no se realiza esta conversión, el compilador supone que está tratando de llamar a la SqlParameter (cadena, SqlDbType) constructor de sobrecarga.

Gracias :) Msdn

5

El 0 está de paso en la es tipo, no el valor. 0 literales (y valores constantes) están permitidos para tipo de enumeración - es decir, el 0 del tipo de enumeración subyacente, y son un mejor "partido" que el objeto, ya que no es necesario el uso del boxeo.

Personalmente, yo usaría;

Value = 0 

Quizás en el inicializador de objetos.

Cuestiones relacionadas