2009-03-27 13 views
7

Tengo una computadora portátil nueva en el trabajo y el código que funcionaba anteriormente en la semana no funciona hoy en día.C# cadena de análisis "0" al entero

El código que funcionó antes es, simplificado:

while (dr.Read()) 
{ 
    int i = int.Parse(dr.GetString(1)) 
} 

Ahora se produce un error cuando el valor de la base de datos es 0. A veces, pero no de forma fiable, esto va a funcionar en su lugar:

while (dr.Read()) 
{ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 

I Am ¿Perder algo estúpido?

Por extraño que parezca, ReSharper también tiene toneladas de errores extraños con el mismo mensaje de error que recibo con el código anterior: "la cadena de entrada no estaba en el formato correcto". (Se inicia antes de que siquiera cargue un proyecto.)

¿Alguna idea? ¿Alguien tiene problemas de SP? Intenté asegurarme de que todos mis SP estuvieran actualizados cuando obtuve la máquina.

EDIT: Entiendo cómo usar Try.Parse y el manejo de errores. El código aquí está simplificado. Estoy leyendo casos de prueba de una tabla de base de datos. Esta columna tiene solo 0, 1 y 2 valores. Lo he confirmado. Rompí esto poniendo el campo de la base de datos en una variable de cadena y luego int.Parse (s). El código funcionó a principios de esta semana y la base de datos no ha cambiado. Lo único que ha cambiado es mi entorno.

Para simplificar el problema por completo, esta línea de código produce una excepción ("cadena de entrada no estaba en el formato correcto"):

int.Parse("0"); 

EDIT: Gracias a todos por ayudar a resolver este problema! La solución obligaba a restablecer mi configuración de idioma.

+0

¿Qué tipo de datos es la columna de la tabla? –

+0

¿El campo permite valor nulo? –

+0

Si crea una nueva aplicación con la única línea de código de ejecución personalizada que es int.Parse ("0"); y está arrojando un error, entonces creo que podrías tener un problema mayor. –

Respuesta

21

Una posible explanation:

Básicamente, el problema era el valor sPositiveSign bajo HKEY_CURRENT_USER \ Control Panel \ International se establece en 0, que significa el signo positivo es '0'. Por lo tanto, al analizar el "signo positivo 0" se corta y luego el resto de la cadena ("") se analiza como un número , lo que no funciona, por supuesto. Esto también explica por qué int.Parse ("00") no fue un problema. Aunque no puede establecer el signo positivo a '0' a través de el Panel de control, todavía es posible hacerlo a través del registro, causando problemas. Ni idea de cómo el equipo de el usuario en el post terminado con este ajuste incorrecto ...

Mejor aún, ¿cuál es la salida de este en su máquina:

Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign); 

I' Estoy dispuesto a apostar el tuyo imprime un 0 ... cuando el mío imprime un signo +.

Sugiero revisar su configuración de Control Panel > Regional and Language Options ... si parecen normales, intente cambiarlas a algo más que a cualquier idioma que esté usando (estoy asumiendo inglés).

+0

¿No daría eso un Octal 0 en su lugar? –

+0

Gracias, comprobaré esto un poco después de dejar salir a los perros, jaja. – Leslie

+0

@chris - no (pruébalo con "010", todavía obtienes 10), pero aun así un 0 octal sigue siendo 0 :) –

2

¿Estás seguro de que es "0" y no "nulo"? ¿Qué excepción obtienes?

EDIT:

Sólo por curiosidad, si es realmente fallamiento en int.Parse ("0"), que se puede tratar int.Parse ("0", CultureInfo.InvariantCulture) ;?

De lo contrario, publique su consulta. ¿Alguna unión?

+0

Estoy seguro de que es cero y no nulo. La columna solo tiene 0, 1 y 2. Solo 0 falla. System.FormatException: La cadena de entrada no tenía el formato correcto. – Leslie

+0

¿0 está almacenado como valor numérico? ¿Qué tipo de datos es la columna en la tabla? –

+0

El campo de la base de datos es int. – Leslie

2

Editar:
@ respuesta de Mike me hizo pensar que es un comportamiento extremadamente rara y una simple búsqueda en Google dio el siguiente resultado: int.Parse weird behavior

Una cadena vacía podría también causar este problema.

Puede comprobar si hay dbnull antes de analizar, también es bueno validar los datos analizados.

Se puede usar un valor por defecto y TryParse ..

int i = -1; 
if(!int.TryParse(dr["MyColumn"] as string, out i)) 
    //Uh Oh! 

Editar:
he publicado esto como un comentario en respuesta @ Chris, pero si el tipo de datos SQL es int entonces por qué no sólo tiene que utilizar el GetInt32 método en el DataReater en lugar de recuperarlo como una cadena y manual de analizarlo?

+0

Creo que tuve problemas con eso también, pero no recuerdo lo que eran ahora. He estado luchando con esto todo el día. – Leslie

+0

¡Gracias por agregar esa edición! Eso es EXACTAMENTE lo que estaba buscando. No tengo idea de cuánto tiempo les ha llevado encontrarlo :) Les agradezco que encuentren el enlace correcto para ver. – Mike

+0

@Mike, no hubo problema cuando dijiste que tenías el mismo problema que tenía que investigarlo, estoy muy contento de que haya sido útil. –

3

Creo que generalmente no se considera una buena idea llamar a Convert.ToInt32 para la lectura de valores de la base de datos, ¿qué pasa con el valor nulo? ¿Qué pasa con el valor no se puede analizar? ¿Tiene algún código de manejo de excepciones aquí?

  1. Asegúrese de que el valor no sea nulo.
  2. Compruebe que el valor se pueda analizar antes de llamar a Int32.Parse. Considera Int32.TryParse.
  3. considere usar un tipo de nullable como int? en este caso.

HTH.

0

¿Está buscando null?

if(!dr.IsNull("FieldName")){ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 
1

debe comprobar dr [ "FieldName"]! = DBNull.Value y se debe utilizar TryParse si pasa la prueba DBNull ...

if (dr["FieldName"] != DBNull.Value) 
{ 
    int val = 0; 
    if (int.TryParse(dr["FieldName"], out val)) 
    { 
     i = val; 
    } 
    else 
    { 
     i = 0; // or some default value 
    } 
} 
1

He visto este asunto con los cultivos Clase doble de .NET, analizando desde la cadena "0" también.

Aquí está la parte realmente loca: puede pasar el problema usando una cuenta de usuario diferente para ejecutar el programa, y ​​a veces si destruye y vuelve a crear la cuenta de usuario actual en la máquina, correrá bien .

Todavía tengo que rastrear esto, pero es posible que lo supere de esta manera al menos.

+0

¡Gracias por algo además de la gestión de errores para probar! Sé cómo verificar nulos. :) – Leslie

1

Esto es fuera del campo izquierdo, pero verifique la configuración de localización. Tuve varias "cadenas de entrada que no estaban en el formato correcto" cuando moví un sitio web a un servidor canadiense. El problema estaba en un método DateTime.Parse, y se solucionó al establecer el cultivo en "en-US".

Sí, su situación es diferente — pero bueno, nunca se sabe.

+0

Sí, fue localización. Decía que estaba en US-EN, pero cambiarlo a francés y volver al inglés resolvió el problema. ¡Gracias! – Leslie