2009-07-23 18 views
17

Tengo una consulta SQL que devuelve un solo campo: una ID de tipo INT.Int32.TryParse() o (int?) Command.ExecuteScalar()

Y tengo que usarlo como un número entero en el código C#.

¿De qué manera es más rápido y utiliza menos memoria?

o

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

o

int? id = command.ExecuteScalar() as int?; 
if(id.HasValue) 
{ 
    // use id.Value 
} 
+1

sé que esto es viejo, pero relevante Donald Knuth cita: "Los programadores perder enormes cantidades de tiempo a pensar, o preocuparse por la velocidad de las partes no críticas de sus programas, y estos intentos de la eficiencia en realidad tienen una fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Debemos olvidarnos de pequeñas eficiencias, digamos el 97% del tiempo: la optimización prematura es la raíz de todo mal. Sin embargo, no deberíamos dejar pasar nuestras oportunidades en ese crítico 3% ". –

+0

Hola @DannyNeumann, en general, no creo que tenga mucho sentido publicarlo aquí ya que es una pregunta de 2009. En particular, escribir un código eficiente sigue siendo importante. Y así es como aprendí a hacerlo.Todos los días veo códigos horribles y horribles que se ajustan perfectamente a la cita de Knuth. Dicho esto, no se debe perder mucho tiempo en la optimización prematura de las partes no críticas, pero al mismo tiempo no se deben escribir las partes no críticas de manera ineficiente. – abatishchev

Respuesta

22

La diferencia entre los tres aspectos es insignificante. El cuello de botella está trasladando los datos del DB a su aplicación, no un lanzamiento trivial o una llamada a un método.

me iría con:

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

Se falla antes, si un día la gente cambia el comando para devolver una cadena o una fecha, al menos que se colgará y usted tendrá la oportunidad de arreglar eso.

También me gustaría ir con un simple molde intIF Siempre esperé que el comando devolviera un solo resultado.

Nota, generalmente prefiero devolver un parámetro que ejecutar el escalar ejecutar, ejecutar escalar se siente frágil (la convención de que la primera columna en la primera fila es un valor de retorno no me sienta bien).

+0

ExecuteScalar() es una gran victoria en vb, donde puede simplemente hacer un CInt() o CStr() en él. –

2

este último. Convert.ToInt32() es también una opción.

+1

El primer método es de Satanás por muchas razones. Es más lento Y menos legible. Yuck. –

+0

Convert.ToInt32() funcionó para mí, mientras que un molde no lo haría, con command.ExecuteScalar(); – JYelton

1

¡Use id.HasValue para el máximo factor de tipo Nullable!

19

Si espera que el comando devuelva nulo, debe tener en cuenta que la base de datos nula (DBNull) no es lo mismo que .NET null. Entonces, la conversión de DBNull a int? fallaría.

me gustaría sugerir lo siguiente:

object result = command.ExecuteScalar(); 
int? id = (int?)(!Convert.IsDBNull(result) ? result : null); 
+2

Tenga en cuenta que si execute escalar no devuelve filas, obtendrá un nulo. Tiene razón en que si la primera fila en la primera columna es nula, podría tener problemas. –

+1

pero, una vez más, es ID (por lo menos lo he leído como identidad/clave), por lo que DBNull no es un problema –

+0

@Sam Saffron, estuvo de acuerdo en el conjunto de filas vacío. @Rune FS, no conocemos la lógica subyacente aquí. No asumiría si una consulta puede devolver nulo o no, basándose solo en un nombre de variable. – VladV

5

Si ninguno de los trabajos anteriores (especialmente para los usuarios que están luchando con MySQL) por qué no pruebas a la siguiente?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 
2
int Result = int.Parse(Command.ExecuteScalar().ToString()); 

funcionará en C#.

+2

Es un mal enfoque primero volcar a la cadena y luego analizar cuando el objeto ya es una int, solo requiere ser copiado. – abatishchev

-2
if ((Int32)cmd.ExecuteScalar() ** 1) //en esta parece qu esta el error pero no lo veo 
{ 
    Response.Redirect("Default.aspx"); 
} 
else 
{ 
    Response.Redirect("error.htm") ; 
} 
+1

¿Es esta una respuesta? ¿O estás tratando de obtener ayuda? Porque ese comentario en español significa * "Parece que el error está aquí pero no puedo verlo" * – brasofilo