【问题标题】:Error converting data type varchar to float. c# webservice [closed]将数据类型 varchar 转换为浮点数时出错。 c#webservice [关闭]
【发布时间】:2017-04-30 21:00:38
【问题描述】:

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

}

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

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

参数值 id: 0 特别: 0001 amt: 10 adjamt: 10 tdate:
01-01-2013,01-01-2013 总计:20 日期:01-01-2013 utrno:测试 付款方式:测试转移日期:01-01-2013 培训师:易卜拉欣 shaikh 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

【问题讨论】:

  • 请首先将其减少为只是导致问题的参数-您可以找到它,但我们不能轻易找到。另外,以后请花时间把代码格式化清楚,不要有任何多余的缩进。不需要很长时间,但它会在可读性方面发挥重要作用。
  • 您的一列是浮点数,您正在传递一个字符串。你连错误信息都没看吗?
  • 对不起先生,下一篇文章会记住这一点
  • 查询中的每个参数占位符都在单引号内。这会将这些占位符转换为文字字符串。这些参数在这里根本没有使用。删除占位符周围的单引号,然后重试(不确定这是否会解决问题,因为仍然需要将浮点数作为浮点数而不是字符串传递)

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


【解决方案1】:

我敢于对上面 John Skeet 的回答进行一些改进,因为您的代码中还有其他问题需要解决。

第一个问题是您将 DateTime 或 Float 类型的参数传递给字符串。这是否可行取决于输入是什么以及数据库引擎认为如何将字符串转换为列的适当值。

以浮点值为例。如果你传递一个像 10 这样的简单值,一切都很好,但是如果你传递一个像 10,5 这样的值(在某些语言环境中是一个有效的浮动“字符串”)并且你的数据库引擎尝试在它的不同语言环境中转换它,你最终会得到一个截断或错误。同样的(并且更有可能)发生在日期上。使用“1/1/2013”​​一切都很好,但是如果字符串是“25/1/2013”​​并且数据库引擎使用 MM/d/yyyy 日期区域设置怎么办?又一次等待发生的失败。

我真的建议您在将值添加到参数集合之前,通过对特定类型的适当转换和健全性检查来控制这些问题,就像您对 Int 所做的那样。

第二个问题在于 foreach 循环。 tdate 的输入值为“01-01-2013,01-01-2013”​​,因此您的循环运行两次并插入两条记录。我不知道这是否正确,但问题是 adjamtdate 的值仅包含一个元素(而不是两个),但您仍然将它们拆分为tdate 参数。代码不会触发 Index Out Of Range Exception 只是因为您在循环中使用了变量 i 而没有增加它。同样,这似乎是不正确的。

【讨论】:

    【解决方案2】:

    问题出在你的 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);
    

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

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

    【讨论】:

      【解决方案3】:

      我认为您不应该在 SQL 语句中的参数名称周围加上单引号。

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

      应该是:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        相关资源
        最近更新 更多