2016-12-15 3 views
2

Я создаю веб-приложение, с помощью C#,Ошибка преобразования типа данных varchar в float. C# вебсервис

Вот мой вебсервис для сохранения записи

[WebMethod] 
[ScriptMethod(UseHttpGet = true)] 
public void saverecd(string id, string particular,string amt,string adjamt,string tdate, string total, string date, string utrno, string modeofpayment, string transferdate,string trainer, string typeofadj, string bnkid) 
{ 
    List<string> td = tdate.Split(',').ToList(); 
    int i = 0; 
    foreach (string 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(); 
    } 

} 

я не знаю, что случилось с этим кодом,

это то, что я войти в веб-службы

Параметр Значение идентификатор: 0 частности: 0001 амт: 10 adjamt: 10 TDate:
01-01-201 3,01-01-2013 всего: 20 Дата: 01-01-2013 utrno: тест modeofpayment: тест transferdate: 01-01-2013 тренер: Ibrahim SHAIKH typeofadj: регулировка bnkid:
Invoke

и следующая ошибка

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, String resetOptionsString, 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, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at mvcerp2.newpayment.saverecd(String id, String particular, String amt, String adjamt, String tdate, String total, String date, String utrno, String modeofpayment, String transferdate, String trainer, String typeofadj, String bnkid) in Z:\mvcerp2\mvcerp2\newpayment.asmx.cs:line 135 
+0

Начните с уменьшения этого до * просто * параметра, вызывающего проблему, - вы можете это выяснить, но мы не можем легко. Кроме того, в будущем, пожалуйста, найдите время, чтобы четко форматировать код без каких-либо посторонних отступов. Это не займет много времени, но это делает разницу в удобочитаемости. –

+0

Один из ваших столбцов - это float, и вы передаете строку. Вы даже не посмотрели сообщение об ошибке? –

+0

извините, сэр, что запомнит это для следующего сообщения. –

ответ

4

Проблема с вашим SQL, который я переформатирован здесь, чтобы избежать одну большую строку:

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); 

что SQL не содержит каких-либо параметров. Вместо этого, он содержит строку в кавычках значения «@sonvinid» и т.д. Вы должны удалить кавычки вокруг имен параметров:

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); 

В этот момент, каждое значение действительно является параметром, который является то, что вы хотите.

(я добавил пробелы, а также сделать его более удобным для чтения.)

0

Я не думаю, что вы должны иметь одинарные кавычки вокруг имен параметров в инструкции SQL.

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

Должен быть:

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

С одинарными кавычками они будут интерпретированы как строки, а не в качестве параметров.

0

Смею улучшить немного на ответ от Джон тарелочкам выше, потому что есть и другие проблемы в вашем коде, которые должны быть решены ,

Первая проблема заключается в том, что вы передаете своим параметрам тип DateTime или Float строку. Это может работать или не зависит от того, что представляет собой вход и что движок базы данных думает сделать, чтобы преобразовать строку в соответствующее значение для столбца.

Возьмем, к примеру, значение поплавка. Если вы передадите простое значение, как 10, все будет хорошо, но если вы передадите значение, равное 10,5 (допустимая плавающая «строка» в некоторых локалях), и ваш механизм базы данных попытается преобразовать его в свой РАЗНЫЙ язык, вы получите усечения или ошибки. То же (и с большей вероятностью) происходит с датами. С «1/1/2013» все хорошо, но что, если строка «25/1/2013», а в базе данных используется MM/d/yyyy locale для дат? Опять неудача в ожидании.

Я действительно предлагаю вам взять под контроль эти проблемы с соответствующим преобразованием определенного типа и проверки работоспособности перед добавлением значений в набор параметров, как вы это делаете с Int.

Вторая проблема заключается в петле foreach. Ваше входное значение для tdate - «01-01-2013,01-01-2013», поэтому ваш цикл работает два раза и вставляет две записи. Если это правильно или нет, я не знаю, но проблема заключается в значениях для adjamt и date, который содержит только один элемент (не два), но вы все равно разделяете их как параметр tdate. Код не вызывает Index Out Of Range Exception только потому, что вы используете переменную i внутри вашего цикла, не увеличивая его. Опять же, это кажется неправильным.

Смежные вопросы