Impossible de convertir le paramètre de la valeur à partir d'une Chaîne en un nombre Décimal
Im importation d'un fichier csv à ma table sql server en utilisant le code suivant
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();
où le paramètre 3 et 4 sont de type decimal(9,6) dans le DDL lorsque j'exécute le code à ExecuteNonQuery
- je obtenir de l'exception suivante
Impossible de convertir le paramètre de la valeur à partir d'une Chaîne en un nombre Décimal.
merci de m'aider à trouver le problème tnx.
MODIFIER
la valeur dans la crntRecord[3] ressemble
- Quelles sont les valeurs exactes que "crntRecord" tableau contient?
- Ne savez pas quel type de
crntRecord
est. Si c'est unDataRow
,crntRecord[0]
serait de typeobject
qui très probablement peut-être unstring
. - Pourriez-vous fournir un exemple de ce que les valeurs de la
crntRecord
tableau sont? - Avez-vous réglé votre programme et vérifié les valeurs de
crntRecord
des indices 0, 1, 3, et 4? Je suppose qu'au moins l'un de ces non-numérique. - Je me risquerais à deviner que le type retourné par
crntRecord[3]
etcrntRecord[4]
sontString
. Vous pouvez le vérifier en ajoutant:string test = crntRecord[3]
et de la vérification pour voir si il compile. - Singh Chouhan oui, ils sont le type de chaîne de valeurs, mais quand je les convertir en décimal je reçois le message d'erreur de la chaîne d'entrée n'était pas dans le bon format
- pouvez-vous coller ici que la valeur de chaîne est..? de sorte que nous pouvons voir
- Je vais aller sur une branche et dire qu'ils ne sont pas réellement des valeurs décimales... =)
- j'ai édité le post original
- sont ceux "\" étant passé..? vous avez besoin de supprimer les caractères de retour si c'est le cas.. vous ne pouvez pas convertir un retour char + "\43.445\" en nombre décimal ..et bien sûr, ce sera un échec ..essayer avec de la ficelle.replace() sur chaque chaîne ou de faire une Vérification sur la chaîne si elle contient "\" utiliser des chaînes de caractères.Replace() else Convertir la Chaîne en un nombre Décimal
- Ce n'est pas un "\", c'est un guillemet. Le \ est un caractère d'échappement.
- Daniel, je ne peux pas dire en regardant cette petite capture d'écran..
- Les valeurs sont entourés par des guillemets ("), c'est pourquoi vous obtenez le message d'erreur avec
decimal.Parse()
- tnx pour me pointer dans la bonne dir
- tnx tout le monde de prendre le temps..
Vous devez vous connecter pour publier un commentaire.
En supposant que
crntRecord
est un tableau de chaînes de caractères, vous devez analyser les chaînes de caractères en un nombre décimal en premier.Ex:
Noter que cette va lancer une exception si
crntRecord[3]
n'est pas parseable d'une virgule; si c'est une situation qui pourrait se produire, regarder dansdecimal.TryParse()
à la place.Input string was not in a correct format.
"-71.013202"
, avec des guillemets. Essayezdecimal.Parse(crntRecord[3].ToString().Replace("\"", string.Empty));
Modifié pour une utilisation plus sûre d'analyse des méthodes de
Vos chaînes environnant les citations que vous avez besoin de la bande. Essayez
Je recommande l'utilisation de cette méthode pour tous vos décimales, ce qui mettrait cette logique dans une réutilisables fonction d'être un lieu de refactoring.
Decimal.TryParse()
et de gérer le cas où la valeur n'est pas vraiment une valeur décimale.essayer avec
Utilisation
AddWithValue
va certainement créer un paramètre d'unSqlDbType
pour la .NET type decrntRecord[0]
est. Le problème, c'est que l'OP spécifiquement des besoins d'unSqlDbType.Decimal
paramètre. Supposons quecrntRecord[0]
était une chaîne avec une valeur de"ThisIsAString"
. L'appel deAddWithValue
entraîneraSqlDbType.SqlString
paramètre, qui sera ensuite échouer lorsque la requête frappe la DB.AddWithValue
est idéal lors de vos objets correspondent aux types de données approprié que votre requête est attend. Il ne fonctionne pas bien si vous avez besoin de convertir votre premier objet (comme c'est le cas quand vous avez une représentation de chaîne de type numérique).