2009-03-27 13 views
7

Ich habe einen neuen Laptop bei der Arbeit und Code, der früher in der Woche funktionierte funktioniert heute nicht.C# Parse String "0" zu Integer

Der Code, der vor gearbeitet, vereinfacht:

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

Jetzt scheitert es, wenn der Datenbankwert 0. Manchmal, aber nicht zuverlässig, wird diese stattdessen arbeiten:

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

Am I etwas dummes fehlt?

Seltsamerweise hat ReSharper auch Tonnen von seltsamen Fehlern mit der gleichen Fehlermeldung, die ich mit dem obigen Code bekomme: "Eingabezeichenfolge war nicht im richtigen Format." (Startet, bevor ich sogar ein Projekt lade.)

Irgendwelche Ideen? Wer hat SP-Probleme? Ich habe versucht, sicherzustellen, dass alle meine SPs auf dem neuesten Stand waren, als ich die Maschine bekam.

EDIT: Ich verstehe, wie Try.Parse und Fehlerbehandlung zu verwenden. Der Code ist hier vereinfacht. Ich lese Testfälle aus einer Datenbanktabelle. Diese Spalte enthält nur 0, 1 und 2 Werte. Das habe ich bestätigt. Ich brach dies auf, legte das Datenbankfeld in eine Stringvariable s und versuchte dann int.Parse (s). Der Code hat Anfang dieser Woche funktioniert und die Datenbank hat sich nicht geändert. Das einzige, was sich verändert hat, ist meine Umgebung.

Um das Problem vollständig zu vereinfachen, diese Zeile Code löst eine Ausnahme („Eingabezeichenfolge nicht im richtigen Format war“):

int.Parse("0"); 

EDIT: Vielen Dank an alle für die Hilfe dieses Problem zu beheben! Die Lösung erzwang ein Zurücksetzen meiner Spracheinstellungen.

+0

Welcher Datentyp ist die Tabellenspalte? –

+0

Erlaubt das Feld Nullwert? –

+0

Wenn Sie eine neue Anwendung mit der einzigen benutzerdefinierten Befehlszeile erstellen, die int.Parse ("0") ist; und es wirft einen Fehler auf, dann denke ich, dass Sie ein größeres Problem haben könnten. –

Antwort

21

Eine mögliche explanation:

Im Grunde war das Problem der sPositiveSign Wert unter HKEY_CURRENT_USER \ Control -Panel \ International 0 gesetzt wird, , die das positive Vorzeichen bedeutet '0' ist. So wird beim Parsen das "positive Zeichen 0" abgeschnitten und dann der Rest der Zeichenkette ("") als Nummer geparst, was natürlich nicht funktioniert. Dies erklärt auch, warum int.Parse ("00") kein Problem war. Obwohl Sie nicht das positive Zeichen auf 0 bis der Systemsteuerung setzen können, ist es immer noch , es über die Registrierung zu tun, was Probleme verursacht. Keine Ahnung, wie der Computer von der Benutzer in der Post mit dieser falschen Einstellung ...

Noch besser wäre es am Ende, was den Ausgang dieses auf Ihrem Rechner ist:

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

I‘ m wetten Sie Ihre Drucke eine 0 ... wenn meins druckt ein + Zeichen aus.

Ich schlage vor, überprüfen Sie Ihre Control Panel > Regional and Language Options Einstellungen ... Wenn sie normal erscheinen, versuchen Sie, sie zu etwas anderem als zurück in der Sprache, die Sie verwenden (ich nehme Englisch).

+0

Würde das nicht stattdessen ein Octal 0 geben? –

+0

Danke, ich überprüfe das ein bisschen, nachdem ich die Hunde rausgelassen habe, LOL. – Leslie

+0

@chris - nein (versuch es mit "010", du bekommst immer noch 10), aber trotzdem ist ein Oktal 0 immer noch 0 :) –

2

Sind Sie sicher, dass es "0" und nicht "null" ist? Welche Ausnahme bekommst du?

EDIT:

Nur aus Neugier, ob es wirklich auf int.Parse ("0") Verwerfungen ist, können Sie versuchen int.Parse ("0", CultureInfo.InvariantCulture) ;?

Andernfalls posten Sie Ihre Abfrage. Irgendwelche Verbindungen?

+0

Ich bin sicher, es ist null und nicht null. Die Spalte hat nur 0, 1 und 2. Nur 0 schlägt fehl. System.FormatException: Die Eingabezeichenfolge hatte kein korrektes Format. – Leslie

+0

Wird 0 als numerischer Wert gespeichert? Welcher Datentyp ist die Spalte in der Tabelle? –

+0

Das Datenbankfeld ist int. – Leslie

2

Edit:
@ Mike Antwort machte ich denken, dass extrem seltsames Verhalten ist und eine einfache Google-Suche ergab dieses Ergebnis: int.Parse weird behavior

Eine leere Zeichenkette würde auch dieses Problem verursachen.

Sie könnten vor dem Parsen nach dbnull suchen, es ist auch gut, geparste Daten zu validieren.

Sie einen Standardwert und TryParse verwenden könnte ..

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

Edit:
ich dies in @ Chris Antwort als Kommentar gepostet, aber wenn der SQL-Datentyp int ist, warum dann nicht nur die Verwendung GetInt32 Methode auf dem DataReater, anstatt es als String abzurufen und manuell zu analysieren?

+0

Ich denke, hatte auch Probleme damit, aber ich erinnere mich nicht, was sie jetzt waren. Ich habe den ganzen Tag damit gerungen. – Leslie

+0

Danke für das Hinzufügen, dass bearbeiten! Das ist GENAU, wonach ich gesucht habe. Ich habe keine Ahnung, wie lange es gedauert hat, bis sie das gefunden haben :) Ich weiß es zu schätzen, dass du den richtigen Link gefunden hast, um ihn anzuschauen. – Mike

+0

@Mike, Kein Problem, wenn Sie sagten, dass Sie das gleiche Problem hatten, musste ich mich darum kümmern, ich bin wirklich froh, dass es hilfreich war. –

3

Ich denke, es ist allgemein keine gute Idee, Convert aufzurufen.ToInt32 für den Wert aus der Datenbank gelesen wird, was ist der Wert ist Null, was ist mit dem Wert kann nicht analysiert werden. Haben Sie hier einen Ausnahmebehandlungscode?

  1. Stellen Sie sicher, dass der Wert nicht null ist.
  2. Überprüfen Sie, ob der Wert vor dem Aufruf Int32.Parse analysiert werden kann. Betrachte Int32.TryParse.
  3. Betrachten Sie einen NULL-fähigen Typ wie int? in diesem Fall.

HTH.

0

suchen Sie nach null?

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

Sie sollten dr überprüfen [ "Feldname"]! = DBNull.Value und Sie sollten TryParse verwenden, wenn es den DBNull Test bestanden ...

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

Ich habe dieses Problem Ernte gesehen nach oben mit .NET Double-Klasse, Parsing von String "0".

Hier ist der wirklich verrückteste Teil: Sie können über die Frage erhalten, indem ein anderes Benutzerkonto mit dem Programm laufen, und manchmal, wenn Sie zerstören und neu erstellen das aktuelle Benutzerkonto auf der Maschine, wird es gut laufen .

Ich habe es noch zu verfolgen, aber Sie könnten es auf diese Weise zumindest vorbeikommen.

+0

Danke für etwas außer Fehlerbehandlung zu versuchen !!! Ich weiß, wie man nach Nullen sucht. :) – Leslie

1

Dies ist weit außerhalb des linken Bereichs, aber überprüfen Sie Ihre Lokalisierungseinstellungen. Ich hatte eine Anzahl von "Eingabe-String war nicht in einem korrekten Format", als ich eine Website auf einen kanadischen Server verschoben. Das Problem bestand in einer DateTime.Parse-Methode und wurde behoben, indem die Kultur auf "en-US" festgelegt wurde.

Ja, Ihre Situation ist anders — aber hey, man kann nie wissen.

+0

Ja, es war Lokalisierung. Es hieß, es sei auf US-EN, aber die Umstellung auf Französisch und zurück auf Englisch löste das Problem. Vielen Dank! – Leslie