7 Stimmen

C# parsen Zeichenkette "0" in Ganzzahl

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

Der Code, der vorher funktionierte, wird vereinfacht:

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

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

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

Habe ich etwas Dummes verpasst?

Seltsamerweise ist ReSharper auch mit Tonnen von seltsamen Fehler mit der gleichen Fehlermeldung, die ich mit dem obigen Code erhalten: "input string was not in the correct format." (Fängt an, bevor ich überhaupt ein Projekt lade.)

Irgendwelche Ideen? Hat jemand Probleme mit SP? Ich habe versucht, sicherzustellen, dass alle meine SPs auf dem neuesten Stand waren, als ich den Rechner bekam.

EDIT: Ich weiß, wie man Try.Parse und Fehlerbehandlung verwendet. Der Code hier ist vereinfacht. Ich lese Testfälle aus einer Datenbanktabelle. Diese Spalte hat nur 0, 1, und 2 Werte. Das habe ich bestätigt. Ich habe das Datenbankfeld in eine String-Variable s gesetzt und dann int.Parse(s) ausprobiert. Der Code funktionierte Anfang dieser Woche 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 ("input string was not in the correct format"):

 int.Parse("0");

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

21voto

John Rasch Punkte 60054

Eine mögliche Erklärung :

Das Problem war im Wesentlichen die sPositiveSign-Wert unter HKEY_CURRENT_USER \Control Panel \International auf 0 gesetzt wird, was bedeutet, dass das positive Vorzeichen "0" ist. Beim Parsen wird also das "positive Vorzeichen 0" abgeschnitten und dann der Rest der Zeichenkette ("") wird als Zahl geparst Zahl geparst, was natürlich nicht funktioniert. Dies erklärt auch, warum int.Parse("00") kein Problem darstellte. Obwohl man nicht das positive Vorzeichen über die Systemsteuerung auf Systemsteuerung setzen kann, ist es dennoch möglich es über die Registrierung zu tun, was zu Probleme. Keine Ahnung, wie der Computer des des Benutzers in dem Beitrag mit dieser diese falsche Einstellung hat...

Oder noch besser, wie sieht die Ausgabe auf Ihrem Rechner aus?

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

Ich wette, Ihrer druckt eine 0 ... wenn meine einen Ausdruck von + Zeichen.

Ich schlage vor, Sie überprüfen Ihre Control Panel > Regional and Language Options Einstellungen... wenn sie normal erscheinen, versuchen Sie, sie auf eine andere Sprache zu ändern und dann wieder auf die Sprache, die Sie verwenden (ich nehme an, Englisch).

3voto

J.W. Punkte 17431

Ich denke, es ist in der Regel nicht als eine gute Idee, Convert.ToInt32 für den Wert aus der Datenbank lesen aufrufen, was über den Wert ist null, was über den Wert kann nicht geparst werden. Haben Sie eine Ausnahmebehandlung Code hier.

  1. Stellen Sie sicher, dass der Wert nicht Null ist.
  2. Prüfen Sie, ob der Wert geparst werden kann, bevor Sie Int32.Parse aufrufen. Erwägen Sie Int32.TryParse.
  3. in diesem Fall einen nullbaren Typ wie int? verwenden.

HTH.

2voto

laktak Punkte 52075

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

EDIT :

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

Andernfalls stellen Sie Ihre Anfrage. Irgendwelche Verknüpfungen?

2voto

Quintin Robinson Punkte 78652

Bearbeiten:
Die Antwort von @Mike brachte mich auf den Gedanken, dass dies ein äußerst merkwürdiges Verhalten ist, und eine einfache Google-Suche führte zu diesem Ergebnis: int.Parse seltsames Verhalten

Eine leere Zeichenfolge würde dieses Problem ebenfalls verursachen.

Sie könnten vor dem Parsen auf dbnull prüfen, außerdem ist es sinnvoll, geparste Daten zu validieren.

Sie könnten einen Standardwert verwenden und TryParse

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

Bearbeiten:
Ich habe dies als Kommentar in @Chris' Antwort gepostet, aber wenn der Sql-Datentyp int ist, warum nicht einfach die GetInt32 Methode für den DataReater zu verwenden, anstatt sie als String abzurufen und manuell zu analysieren?

1voto

Muad'Dib Punkte 27506

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X