2016-12-15 309 views
2

我使用C#創建一個Web應用程序,將數據類型varchar轉換爲float時出錯。 C#web服務

這裏是我的,保存記錄

[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(); 
    } 

} 

我不知道什麼是錯的這個代碼Web服務,

這是我在Web服務進入

參數值ID:0特別是:0001 AMT:10 adjamt:10 tdate:
01-01-201 3,01-01-2013總數:20日期:2013年1月1日utrno:測試 modeofpayment:測試transferdate:2013年1月1日訓練者:IBRAHIM 篩海typeofadj:調整bnkid:
調用

和以下是錯誤

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

你的一個列是一個浮點數,你傳遞一個字符串。你甚至沒有看到錯誤信息? –

+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類型的參數或浮動字符串的事實。這可以工作或不工作,具體取決於什麼是輸入以及數據庫引擎認爲如何將字符串轉換爲列的適當值。

以浮點值爲例。如果你傳遞一個簡單的值,如10,一切都很好,但如果你傳遞一個像10,5這樣的值(在某些語言環境中是一個有效的浮動「字符串」),並且你的數據庫引擎試圖在不同的語言環境中轉換它,截斷或錯誤。日期發生相同(並且更有可能)。使用「2013年1月1日」一切都很好,但如果字符串是「2013/1/1」而數據庫引擎在日期中使用MM/d/yyyy語言環境呢?再次發生失敗等待發生。

我真的建議你在適當轉換特定類型和健全性檢查之前,將這些值添加到參數集中,然後再使用Int來進行控制。

第二個問題在於foreach循環。您輸入的值爲tdate爲「01-01-2013,01-01-2013」​​,因此您的循環運行兩次並插入兩條記錄。如果這是正確的或不是我不知道,但問題是附件日期的值只包含一個元素(不是兩個),但您仍將它們拆分爲tdate參數。代碼不會觸發索引超出範圍異常只是因爲您在循環中使用變量而不增加它。再次,這似乎是不正確的。

相關問題