将数据类型varchar转换为float时出错。 C#web服务

问题描述:

我使用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

对不起,先生,这将记住下一篇文章 –

问题是与你的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); 

在这一点上,每个值真的是一个参数,这是你想要的。

(我在也加入空格,使其更具可读性。)

我不认为你应该在你的参数名称在SQL语句的单引号。

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

应该是:

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

随着单引号,这些将被解释为字符串,而不是作为参数。

我敢改善约翰飞碟双向的答案有点以上,因为有你的代码,需要解决的其他问题。

第一个问题是您传递给DateTime类型的参数或浮动字符串的事实。这可以工作或不工作,具体取决于什么是输入以及数据库引擎认为如何将字符串转换为列的适当值。

以浮点值为例。如果你传递一个简单的值,如10,一切都很好,但如果你传递一个像10,5这样的值(在某些语言环境中是一个有效的浮动“字符串”),并且你的数据库引擎试图在不同的语言环境中转换它,截断或错误。日期发生相同(并且更有可能)。使用“2013年1月1日”一切都很好,但如果字符串是“2013/1/1”而数据库引擎在日期中使用MM/d/yyyy语言环境呢?再次发生失败等待发生。

我真的建议你在适当转换特定类型和健全性检查之前,将这些值添加到参数集中,然后再使用Int来进行控制。

第二个问题在于foreach循环。您输入的值为tdate为“01-01-2013,01-01-2013”​​,因此您的循环运行两次并插入两条记录。如果这是正确的或不是我不知道,但问题是附件日期的值只包含一个元素(不是两个),但您仍将它们拆分为tdate参数。代码不会触发索引超出范围异常只是因为您在循环中使用变量而不增加它。再次,这似乎是不正确的。