Fehler beim konvertieren der parameter-Wert aus einer Zeichenfolge in ein Dezimal -
Im Import einer csv zu meinem sql server-Tabelle mit dem folgenden code
SqlCommand nonqueryCommand = myConnection.CreateCommand();
nonqueryCommand.CommandText =
"INSERT INTO MYTABLE VALUES(@num1, @num2,@num3,@num4)";
nonqueryCommand.Parameters.Add("@num1",SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num2", SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num3", SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num4", SqlDbType.Decimal);
nonqueryCommand.Parameters["@num1"].Value = crntRecord[0];
nonqueryCommand.Parameters["@num2"].Value = crntRecord[1];
nonqueryCommand.Parameters["@num3"].Value =crntRecord[3];
nonqueryCommand.Parameters["@num4"].Value = crntRecord[4];
nonqueryCommand.ExecuteNonQuery();
wo die parameter 3 und 4 sind vom Typ decimal(9,6), die in der DDL, wenn ich den code auszuführen bei ExecuteNonQuery
bekomme ich die folgende exception
Failed to convert parameter-Wert aus einer Zeichenfolge in eine Dezimalzahl.
bitte helfen Sie mir, herauszufinden, das problem tnx.
BEARBEITEN
den Wert in der crntRecord[3] sieht aus wie
- Was sind die genauen Werte, die "crntRecord" array enthält?
- Weiß nicht, welche Art
crntRecord
ist. Wenn es einDataRow
,crntRecord[0]
wäre der Typobject
was sehr wahrscheinlich sein könntestring
. - Könnten Sie ein Beispiel, was die Werte in der
crntRecord
array sind? - Sie haben gedebuggt, Ihr Programm und überprüft die Werte der
crntRecord
auf die Indizes 0, 1, 3, und 4? Ich würde vermuten, dass mindestens einer der nicht-numerischen. - Ich wage zu vermuten, dass der zurückgegebene Typ von
crntRecord[3]
undcrntRecord[4]
sindString
. Sie können dies bestätigen, indem Sie hinzufügen:string test = crntRecord[3]
und zu prüfen, wenn es kompiliert. - Singh Chouhan ja, Sie sind der string-Typ Werte aber wenn ich konvertieren Sie Sie in Dezimalformat ich bekomme die Fehlermeldung " die Eingabezeichenfolge hat das richtige format
- können Sie hier einfügen, was der string-Wert ist..? so dass wir sehen können
- Ich werde gehen auf ein Glied und sagen, dass Sie eigentlich nicht dezimale Werte... =)
- ich habe editiert, der ursprüngliche Beitrag
- sind die "\" übergeben wird..? Sie brauchen, um Streifen aus den Zeichen zurück, wenn dies der Fall ist.. Sie können nicht konvertieren eine Rückkehr char + "\43.445\" in eine Dezimalzahl ..natürlich wird es scheitern ..versuchen Sie es mit string.replace() auf jeder saite, oder Schauen Sie auf die Zeichenfolge, wenn es mit "\" String verwenden.Ersetzen() else Konvertieren Sie die Zeichenfolge in eine Dezimalzahl
- Es ist nicht ein "\", es ist ein Anführungszeichen. Das \ ist ein escape-Zeichen.
- Daniel ich kann nicht sagen, Blick auf diese kleine Screenshot..
- Die Werte sind umgeben von doppelten Anführungszeichen ("), das ist, warum Sie die Fehlermeldung mit
decimal.Parse()
- tnx für den Hinweis mich in die richtige dir
- tnx an alle für die Zeit nehmen..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter der Annahme, dass
crntRecord
ist ein array von Zeichenfolgen, die Sie benötigen, um eine Analyse der strings in eine Dezimalzahl ersten.Ex:
Beachten Sie, dass dies eine Ausnahme, wenn
crntRecord[3]
ist nicht parseable in eine Dezimalzahl; wenn das eine situation, die eintreten könnten, schauen Sie indecimal.TryParse()
statt.Input string was not in a correct format.
"-71.013202"
mit Anführungszeichen. Versuchendecimal.Parse(crntRecord[3].ToString().Replace("\"", string.Empty));
Bearbeitet werden, um die Verwendung sicherer parsing-Methoden
Ihre Saiten haben, die umliegenden Zitate, die Sie brauchen, um sich auszuziehen. Versuchen
Ich würde empfehlen, mit dieser Methode für alle Ihre Dezimalstellen, was bedeuten würde, die Umsetzung dieser Logik in eine wiederverwendbare Funktion wäre ein Anstieg refactoring.
Decimal.TryParse()
und behandeln den Fall, wo der Wert ist nicht wirklich ein decimal-Wert.versuchen mit
Verwenden
AddWithValue
wird auf jeden Fall einen parameter erstellen, der eine angemesseneSqlDbType
für die .NET-Typ, dercrntRecord[0]
ist. Das problem, das Sie haben, ist, dass die OP konkret muss einSqlDbType.Decimal
- Parameters. AngenommencrntRecord[0]
war ein string mit einem Wert von"ThisIsAString"
. AufrufAddWithValue
führtSqlDbType.SqlString
parameter, die dann fehlschlagen, wenn die Abfrage trifft der DB.AddWithValue
Super, wenn Ihr Objekte übereinstimmen, die entsprechenden Daten-Typen, die deine Abfrage erwartet wird. Es funktioniert nicht gut, wenn Sie brauchen, um zu konvertieren Ihr Objekt zunächst (wie ist der Fall, wenn Sie haben eine string-Darstellung eines numerischen Typs).