2010-02-04 20 views
12

Tengo un error de "conversión especificada no es válida". Aplicación de formulario de Windows en C#. Estoy tratando de recuperar un valor de una tabla. El valor es smallint o numeric (probé ambos campos, ambos me dan el mismo error) e intento almacenarlo en una variable int.error de "conversión especificada no es válida" en el programa de formularios de Windows C#

aquí está la fuente:

using (SqlDataReader rdr = cmd.ExecuteReader()) //"select * from table where fieldname = " + value 
{ 

while (rdr.Read()) 
{ 
    int number = (int)rdr["quantity"]; // error is here 
+0

han intentado convert.toint16 (RDR [ "cantidad"]; – David

Respuesta

18

rdr["quantity"] va a ser un algo en caja. Si no es un int, no puede desvincularlo directamente a un int (que es lo que está tratando de hacer) ya que primero debe destrabarlo en el tipo apropiado (por ejemplo, short). Pero esto es demasiado engorroso para mayor claridad por lo que es mejor decir

Convert.ToInt32(rdr["quantity"]); 
+1

este funciona. thx – jello

0

Pruebe una de las dos opciones.

int number = rdr.getInt32(rdr.GetOrdinal("quantity")); 

o

int number = int.parse(rdr["quantity"].ToString()); 
+0

La primera opción no es válida una sobrecarga, el segundo no se compilará – statenjason

+0

Vaya, fijo mis topos, fue escrito de. memoria –

+0

sí, la segunda respuesta editada es correcta. thx – jello

5
if(rdr["quantity"].GetType() != typeof(int)) 
    throw new InvalidOperationException(
     "quantity is a " + rdr["quantity"].GetType()); 
    int number = (int)rdr["quantity"]; // error is here 
+0

No veo cómo esto asigna la cantidad en la variable numérica. Lógicamente, aún así debería obtener un error, si estoy en lo cierto – jello

+1

@jello Lanzará una excepción que te dice excatly qué tipo es rdr ["cantidad"]. Sin saber esto, todas estas respuestas están meando en el viento. Por todo lo que sabemos, "cantidad" es una matriz de bytes friggen. Ponla en tu código y ejecútala. – Will

+0

BTW, cuando digo "ejecutarlo" no me refiero a ejecutarlo en modo de lanzamiento. Ejecútelo en modo de depuración desde Visual Studio. – Will

0

Ha intentado

int number=convert.toint16(rdr["quantity"]); 
+0

debería funcionar también. thx – jello

1

apuesto quantity es NULL, que no es un entero.

+0

no, no es nulo. thx de todos modos – jello

-1

Trate de usar GetInt32 de SqlDataReader()

rdr.GetInt32(rdr.GetOrdinal("quantity")); 
+0

intenté eso. no funciona thx de todos modos – jello

2

sugerencia tonta, tal vez - pero ¿ha considerado probar este - agarrar el resultado de su SqlDataReader como una instancia de object y después de comprobar qué tipo es? ¡Nadie puede decirle mejor que realmente que el sistema de tipo CLR! :-)

using (SqlDataReader rdr = cmd.ExecuteReader()) 
{ 
    while (rdr.Read()) 
    { 
     object obj = rdr["quantity"]; 

     if(obj != null) 
     { 
      string objType = obj.GetType().FullName; 
     } 
    } 
} 

Si usted consigue un valor de nuevo, se puede comprobar qué tipo es y es de esperar convertirlo en consecuencia, en función de sus resultados.

0

Como dices que sabes cuál es el valor porque creaste la base de datos ... ¿Puedes verificar que rdr ["cantidad"] tiene un valor y luego ejecutar un análisis de prueba sobre él?

if(rdr["quantity"] != null) { 
    int? number = null; 
    if(int.TryParse(rdr["quantity"].ToString(), out number)) { 
     Console.WriteLine("Hurray, I have an int. Up vote Coov!"); 
    } 
} 
0
sl_id = Convert.ToInt32(lblintroducerid.Text.ToString()); 
sl_rank = Convert.ToInt32(lblassorank.Text.ToString()); 
Cuestiones relacionadas