将数据类型varchar转换为float时出错。 c#webservice

时间:2016-12-15 09:51:41

标签: c# asp.net sql-server web-services

我正在使用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();
    }

}

我不知道这段代码有什么问题,

这是我在网络服务中输入的内容

  

参数值id:0特殊:0001 amt:10 adjamt:10 tdate:
  01-01-2013,01-01-2013总计:20日期:01-01-2013 utrno:test   modeofpayment:测试transferdate:01-01-2013培训师:易卜拉欣   shaikh typeofadj:adjust 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

3 个答案:

答案 0 :(得分:3)

问题在于你的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不包含任何参数。相反,它包含引用的字符串值&#34; @ sonvinid&#34;您需要删除参数名称周围的引号:

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

此时,每个值都是一个参数,这就是你想要的。

(我也添加了空格以使其更具可读性。)

答案 1 :(得分:0)

我认为你不应该在SQL语句中使用参数名称附加单引号。

CREATE PROCEDURE deposit_in_bank 
    @bank_account INT,
    @deposit_amount INT
AS
    UPDATE BANK_ADMIN.ACCOUNT 
    SET balance = balance + @deposit_amount 
    WHERE account_no = @bank_account

应该是:

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

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

答案 2 :(得分:0)

我敢于从上面的John Skeet得到一些答案,因为您的代码中还有其他问题需要解决。

第一个问题是你传递给DateTime类型的参数或浮点字符串。这可能有效或无效取决于输入是什么以及数据库引擎认为要为列转换适当值的字符串。

以浮动值为例。如果你传递一个像10这样的简单值,那么一切都很好,但是如果你传递一个像10,5这样的值(一个有效的浮动&#34;字符串&#34;在某些语言环境中)并且你的数据库引擎试图在其不同的语言环境中转换它你最终会发生截断或错误。日期也是如此(并且更有可能)。随着&#34; 1/1/2013&#34;一切都很好,但如果字符串是&#34; 25/1/2013&#34;并且数据库引擎使用MM / d / yyyy语言环境作为日期?再次失败等待发生。

我真的建议您通过适当转换为特定类型和健全性检查来控制这些问题,然后再将这些值添加到参数集合中,就像您对Int一样。

第二个问题在于foreach循环。 tdate 的输入值为&#34; 01-01-2013,01-01-2013&#34;,因此您的循环运行两次并插入两条记录。如果这是正确的或不是我不知道,但问题是 adjamt date 的值只包含一个元素(不是两个),但你仍然分裂他们喜欢 tdate 参数。代码不会触发 Index Out of Range Exception ,因为你在循环中使用变量 i 而不增加它。再次,这似乎是不正确的。