Tengo una consulta SQL que devuelve un solo campo – un IDENTIFICADOR de tipo INT.

Y tengo que usarlo como un entero en código C#.

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

int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
  //use id
}

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
}
  • Sé que esto es viejo, pero relevante Donald Knuth cita: «los Programadores de residuos enorme cantidad de tiempo pensando, o la preocupación, la velocidad de críticas partes de sus programas, y estos intentos de eficiencia en realidad tienen un fuerte impacto negativo cuando la depuración y el mantenimiento son considerados. Debemos olvidar los pequeños de la eficiencia, dicen que cerca del 97% del tiempo: optimización prematura es la raíz de todos los males. Sin embargo, no debemos dejar pasar las oportunidades que la crítica del 3%.»
  • Hey @DannyNeumann, en general, creo que no tiene mucho sentido puesto que aquí ya es una cuestión de 2009. En particular, la escritura de código eficiente es todavía importante. Y así es como aprendí a hacerlo. Me cotidiano ver horrible, horrible código que se adapte a Knuth de la cotización a la perfección. Dicho esto, uno no debe pasar mucho tiempo en la optimización prematura de no partes críticas, pero al mismo tiempo, uno no debe escribir no de las partes críticas de manera ineficiente.
InformationsquelleAutor abatishchev | 2009-07-23

7 Comentarios

  1. 22

    La diferencia entre el rendimiento de sabios es insignificante. El cuello de botella es el movimiento de los datos de la base de datos para su aplicación, no es un trivial de yeso o de la llamada al método.

    Me iría con:

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

    Se falla anterior, si un día la gente de cambiar el comando para devolver una cadena o una fecha, a menos que se bloquee y usted tendrá la oportunidad de arreglarlo.

    También me gustaría ir con una simple int elenco SI siempre me espera el comando para devolver un único resultado.

    Nota, por lo general prefieren devolver un parámetro que haciendo el ejecutar escalar, ejecutar escalar se siente frágil (la convención de que la primera columna de la primera fila es un valor de retorno no se sienta bien para mí).

    • ExecuteScalar() es una gran victoria en vb, donde sólo se puede hacer una CInt() o CStr() sobre él.
  2. 19

    Si usted espera que el comando return null, usted debe tener en cuenta que la base de datos null (DBNull) no es la misma .NETO nulo. Así, la conversión de DBNull a int? sería un fracaso.

    Me gustaría sugerir lo siguiente:

    object result = command.ExecuteScalar();
    int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
    • Tenga en cuenta que si ejecutar escalares no devuelve filas, obtendrá un valor nulo. Usted está en lo correcto que si la primera fila de la primera columna es null usted podría estar en problemas.
    • pero a la vez es y la IDENTIFICACIÓN (yo al menos leer que como identidad/clave) para DBNull no es un problema
    • Azafrán, de acuerdo en vacío del conjunto de filas. @Runa FS, no sabemos la lógica subyacente aquí. Yo no asumir que si una consulta puede devolver null o no, basándose sólo en un nombre de variable.
    • convino en que debería segunda adivinar los nombres de las variables, pero me refería al hecho de que es un IDENTIFICADOR de ser devuelto (lo dice en la pregunta) y desde ID es corto de la identidad y de la identidad en (MS)DB teminology son singulares no nulos valores de la cuestión es ambiguo o la consulta no va a volver DBNulls 🙂
    • Podría reducir a int? id = (int?)command.ExecuteScalar() ?? null; ?
  3. 5

    Si ninguna de las anteriores obras (especialmente para los usuarios que están luchando con MySQL)
    ¿por qué no tratar el siguiente?

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

    va a trabajar en C#.

    • Se trata de un mal enfoque primer volcado de la cadena, a continuación, a analizar cuando el objeto es ya un int, que sólo requiere ser fundidas.
  5. 2

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

    • El primer método es de Satanás por muchas razones. Es más lento Y menos legible. Puaj.
    • Convertir.ToInt32() trabajó para mí mientras que un elenco no, con el comando.ExecuteScalar();
  6. 1

    Uso de id.HasValue para la máxima Tipo que acepta valores null cool-factor!

  7. -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") ;
    }
    • Es esta una respuesta? O estás tratando de obtener ayuda? Porque ese comentario español significa ‘Parece que el error está aquí pero no puedo ver’

Dejar respuesta

Please enter your comment!
Please enter your name here