Erreur lors de la conversion du type de données varchar en float. c # webservice

Je crée une application web en utilisant c #,

Voici mon webservice pour save un logging

[WebMethod] [ScriptMethod(UseHttpGet = true)] public void saverecd(ssortingng id, ssortingng particular,ssortingng amt,ssortingng adjamt,ssortingng tdate, ssortingng total, ssortingng date, ssortingng utrno, ssortingng modeofpayment, ssortingng transferdate,ssortingng trainer, ssortingng typeofadj, ssortingng bnkid) { List<ssortingng> td = tdate.Split(',').ToList(); int i = 0; foreach (ssortingng t in td) { SqlCommand cmd = new SqlCommand("insert into finalinstructoreexpense(sonvinid,particulars,amount,totalamt,date,utno,paymentid,paymode,issuedate,sondate,trainer,type,bank_id) values('@sonvinid','@particulars','@amount','@totalamt','@date','@utno','@paymentid','@paymode','@issuedate','@sondate','@trainer','@type','@bank_id')", con); con.Open(); cmd.Parameters.Add("@id", SqlDbType.Int).Value =Convert.ToInt32(id); cmd.Parameters.Add("@particular", SqlDbType.NVarChar).Value = particular; cmd.Parameters.Add("@amount",SqlDbType.Float).Value=adjamt.Split(',')[i]; cmd.Parameters.Add("@totalamt", SqlDbType.NVarChar).Value = total; cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = date.Split(',')[i]; cmd.Parameters.Add("@utno", SqlDbType.NVarChar).Value = utrno; cmd.Parameters.Add("@paymentid",SqlDbType.NVarChar).Value=paymentid; cmd.Parameters.Add("@paymode", SqlDbType.NVarChar).Value = modeofpayment; cmd.Parameters.Add("@issuedate", SqlDbType.DateTime).Value = transferdate; cmd.Parameters.Add("@sondate", SqlDbType.DateTime).Value = t; cmd.Parameters.Add("@trainer", SqlDbType.NVarChar).Value = trainer; cmd.Parameters.Add("@type", SqlDbType.NVarChar).Value = typeofadj; cmd.Parameters.Add("@bank_id", SqlDbType.Int).Value = Convert.ToInt32(bnkid); cmd.ExecuteNonQuery(); message = "Adjusted Amount Inserted Successfully"; con.Close(); } } 

je ne sais pas quel est le problème avec ce code,

c'est ce que j'entre dans le service web

Paramètre Valeur id: 0 en particulier: 0001 amt: 10 adjamt: 10 tdate:
01-01-2013,01-01-2013 total: 20 date: 01-01-2013 utrno: test mode de paiement: test transferdate: 01-01-2013 formateur: ibrahim cheikh typeofadj: ajuster bnkid:
Invoquer

et suivant est l'erreur

 System.Data.SqlClient.SqlException: Error converting data type varchar to float. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, Ssortingng resetOptionsSsortingng, Boolean isInternal, Boolean forDescribeParameterEncryption) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Ssortingng method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Ssortingng methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at mvcerp2.newpayment.saverecd(Ssortingng id, Ssortingng particular, Ssortingng amt, Ssortingng adjamt, Ssortingng tdate, Ssortingng total, Ssortingng date, Ssortingng utrno, Ssortingng modeofpayment, Ssortingng transferdate, Ssortingng trainer, Ssortingng typeofadj, Ssortingng bnkid) in Z:\mvcerp2\mvcerp2\newpayment.asmx.cs:line 135 

Le problème est avec votre SQL, que j'ai reformaté ici pour éviter une seule énorme ligne:

 SqlCommand cmd = new SQlCommand( @"insert into finalinstructoreexpense (sonvinid,particulars,amount,totalamt,date, utno,paymentid,paymode,issuedate,sondate,trainer,type,bank_id) values('@sonvinid','@particulars','@amount','@totalamt','@date', '@utno','@paymentid','@paymode','@issuedate','@sondate','@trainer', '@type','@bank_id')", con); 

Ce SQL ne contient aucun paramètre. Au lieu de cela, il contient des valeurs de string entre guillemets de "@sonvinid" etc. Vous devez supprimer les guillemets autour des noms de vos parameters:

 SqlCommand cmd = new SQlCommand( @"insert into finalinstructoreexpense (sonvinid, particulars, amount, totalamt, date, utno, paymentid, paymode, issuedate, sondate, trainer, type, bank_id) values(@sonvinid, @particulars, @amount, @totalamt, @date, @utno, @paymentid, @paymode, @issuedate, @sondate, @trainer, @type, @bank_id)", con); 

À ce moment-là, chaque valeur est vraiment un paramètre, ce que vous voulez.

(J'ai ajouté des espaces pour le rendre plus lisible.)

Je ne pense pas que vous devriez avoir les guillemets simples autour de vos noms de parameters dans l'instruction SQL.

 values('@sonvinid','@particulars','@amount','@totalamt','@date','@utno','@paymentid','@paymode','@issuedate','@sondate','@trainer','@type','@bank_id')", con); 

Devrait être:

 values(@sonvinid,@particulars .... etc. 

Avec les guillemets simples, ils seront interprétés comme des strings plutôt que comme des parameters.

J'ose améliorer un peu la réponse de John Skeet, car il y a d'autres problèmes dans votre code qui doivent être résolus.

Le premier problème est le fait que vous passez à vos parameters de type DateTime ou Float une string. Cela peut fonctionner ou pas selon ce que l'input et ce que le moteur de database pense faire pour transformer une string dans la valeur appropriée pour la colonne.

Prenez par exemple la valeur float. Si vous passez une valeur simple comme 10 tout va bien, mais si vous passez une valeur comme 10,5 (une "string" flottante valide dans certaines locales) et que votre moteur de database essaye de la convertir dans sa locale DIFFERENT vous vous retrouvez avec un troncature ou une erreur. La même chose (et avec plus de probabilité) arrive avec des dates. Avec "1/1/2013" tout va bien, mais que se passe-t-il si la string est "25/1/2013" et que le moteur de database utilise un paramètre régional MM / j / aaaa pour les dates? Encore une fois un échec qui attend de se produire.

Je vous suggère vraiment de prendre le contrôle de ces problèmes avec une conversion appropriée au type spécifique et une vérification d'intégrité avant d'append les valeurs à la collection de parameters comme vous le faites déjà avec l'Int.

Le deuxième problème réside dans la boucle foreach. Votre valeur d'input pour tdate est "01-01-2013, 01-01-2013", donc votre boucle s'exécute deux fois et insère deux loggings. Si c'est correct ou non je ne sais pas mais le problème sont les valeurs pour adjamt et la date qui contient un seul élément (pas deux) mais vous les divisez tout de même comme le paramètre tdate . Le code ne triggers pas une exception Index Out Of Range juste parce que vous utilisez la variable i dans votre boucle sans l'incrémenter. Encore une fois, cela semble être incorrect.