C # parsen String "0" zu Integer

7

Ich habe einen neuen Laptop bei der Arbeit und Code, der früher in der Woche funktionierte funktioniert heute nicht.

Der Code, der zuvor funktioniert hat, ist vereinfacht:

%Vor%

Jetzt schlägt es fehl, wenn der Datenbankwert 0 ist. Manchmal, aber nicht zuverlässig, funktioniert das stattdessen:

%Vor%

Vermisse ich etwas Dummes?

Seltsamerweise hat ReSharper auch eine Menge seltsamer Fehler mit derselben Fehlermeldung, die ich mit dem obigen Code erhalte: "Die Eingabezeichenfolge hatte nicht das richtige Format." (Startet, bevor ich überhaupt ein Projekt lade.)

Irgendwelche Ideen? Wer hat SP-Probleme? Ich habe versucht, sicherzustellen, dass alle meine SPs aktuell 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 geändert hat, ist meine Umgebung.

Um das Problem vollständig zu vereinfachen, löst diese Codezeile eine Ausnahme aus ("Eingabezeichenfolge war nicht im richtigen Format"):

%Vor%

EDIT: Danke an alle, die mir geholfen haben, dieses Problem zu lösen! Die Lösung erzwang ein Zurücksetzen meiner Spracheinstellungen.

    
Leslie 27.03.2009, 19:35
quelle

8 Antworten

21

Eine mögliche Erklärung :

  

Grundsätzlich war das Problem der   sPositiveSign-Wert unter   HKEY_CURRENT_USER \ Steuerung   Panel \ International wird auf 0 gesetzt,   was bedeutet, dass das positive Zeichen "0" ist.   Also, beim Parsen des "positiven Zeichens"   0 "wird abgeschnitten und dann der Rest   der String ("") wird als a analysiert   Nummer, die natürlich nicht funktioniert.   Dies erklärt auch, warum int.Parse ("00")   war kein Problem. Obwohl du nicht kannst   setze das positive Zeichen auf '0' durch   Das Control Panel ist immer noch möglich   um es durch die Registrierung zu tun, verursacht   Probleme. Keine Ahnung, wie der Computer von   der Benutzer in der Post endete damit   diese falsche Einstellung ...

Besser noch, was ist das Ergebnis auf Ihrer Maschine:

%Vor%

Ich wette, dass Ihr einen 0 ausdruckt, wenn mein + -Zeichen ausgibt.

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

    
John Rasch 27.03.2009, 19:58
quelle
3

Ich denke, es ist im Allgemeinen keine gute Idee, Convert.ToInt32 für den Wert aus der Datenbank zu lesen, was ist mit dem 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. könnte einen NULL-fähigen Typ wie int verwenden? in diesem Fall.

HTH.

    
J.W. 27.03.2009 19:39
quelle
2

Bearbeiten:
@ Mike Antwort hat mich denken lassen, dass ist extrem seltsames Verhalten und eine einfache Google-Suche ergab dieses Ergebnis: int.Parse seltsames Verhalten

Eine leere Zeichenfolge würde auch dieses Problem verursachen.

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

Sie könnten einen Standardwert und TryParse ..

verwenden %Vor%

Bearbeiten:
Ich habe dies als Kommentar in der Antwort von @Chris gepostet, aber wenn der SQL-Datentyp int ist, dann verwende einfach die GetInt32 Methode auf dem DataReater, anstatt es als String abzurufen und manuell zu analysieren?

    
Quintin Robinson 27.03.2009 19:38
quelle
2

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

BEARBEITEN:

Nur aus Neugier, wenn es wirklich an int.Parse ("0") gestört ist, können Sie versuchen, int.Parse ("0", CultureInfo.InvariantCulture);?

Andernfalls posten Sie Ihre Anfrage. Irgendwelche verbindet?

    
laktak 27.03.2009 19:37
quelle
1

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

%Vor%     
Muad'Dib 27.03.2009 19:47
quelle
1

Ich habe gesehen, dass dieses Problem mit der Klasse .NET Double auftritt, die auch aus der Zeichenfolge "0" analysiert wird.

Hier ist der wirklich verrückte Teil: Sie können das Problem umgehen, indem Sie ein anderes Benutzerkonto verwenden, um das Programm auszuführen, und manchmal, wenn Sie das aktuelle Benutzerkonto auf dem Computer zerstören und neu erstellen. es wird gut laufen.

Ich muss das noch aufspüren, aber Sie könnten es zumindest auf diese Weise schaffen.

    
Mike 27.03.2009 19:55
quelle
1

Dies ist weit außerhalb des linken Felds, 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, Sie wissen es nie.

    
harpo 27.03.2009 20:45
quelle
0

Suchen Sie nach null?

%Vor%     
Mcbeev 27.03.2009 19:43
quelle

Tags und Links