Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net中将varchar转换为数据类型numeric时出现算术溢出错误_C#_Asp.net_Sql Server - Fatal编程技术网

C# 在asp.net中将varchar转换为数据类型numeric时出现算术溢出错误

C# 在asp.net中将varchar转换为数据类型numeric时出现算术溢出错误,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在尝试插入一个有小数点的记录,例如:7654.00,此列的数据类型为数值(10,12),但我遇到算术溢出错误,我知道我需要先进行转换,但不确定如何转换 我遇到问题的列是TotalCost 以下是我所拥有的: string FullName = row.Cells[1].Text; string TotalCost = row.Cells[6].ToString(); using (SqlConnection myCon = new SqlConnection(myConnStr)) {

我正在尝试插入一个有小数点的记录,例如:7654.00,此列的数据类型为
数值(10,12)
,但我遇到算术溢出错误,我知道我需要先进行转换,但不确定如何转换

我遇到问题的列是
TotalCost

以下是我所拥有的:

string FullName = row.Cells[1].Text;
string TotalCost = row.Cells[6].ToString(); 

using (SqlConnection myCon = new SqlConnection(myConnStr))
{
    using (SqlCommand myCmd = new SqlCommand())
    {
         myCmd.Connection = myCon;
         myCmd.CommandType = CommandType.Text;
         myCmd.CommandText = @"insert into myTable (FullName, TotalCost) 
                               values(@FullName, @TotalCost)";
         myCmd.Parameters.AddWithValue("@FullName", FullName.ToString());

         myCmd.Parameters.AddWithValue("@TotalCost", TotalCost)

         myCon.Open();
         myCmd.ExecuteNonQuery();
         myCon.Close();
     }
}

AddWithValue是添加参数的便捷快捷方式,但正如这两篇博文中所解释的,它有严重的限制


在本例中,您将字符串作为参数
@TotalCost
AddWithValue
AddWithValue
中的第二个参数传递,然后将字符串传递给数据库引擎,导致上述错误

您应该将字符串转换为十进制值(对于货币值使用十进制似乎更合适),然后使用更明确的数据类型声明添加参数

 string TotalCost = row.Cells[6].ToString(); 
 decimal cost;
 if(!decimal.TryParse(TotalCost, out cost))
     // Put here an error message for your user
     // "The value cannot be converted to a decimal value"
 else
 {
    using (SqlConnection myCon = new SqlConnection(myConnStr))
    using (SqlCommand myCmd = new SqlCommand())
    {
        myCmd.Connection = myCon;
        myCmd.CommandType = CommandType.Text;
        myCmd.CommandText = @"insert into myTable (FullName, TotalCost ) 
                              values(@FullName, @TotalCost)";
        myCmd.Parameters.Add("@FullName", SqlDbType.NVarChar).Value = FullName;
        myCmd.Parameters.Add("@TotalCost", SqlDbType.Decimal).Value = cost;
        myCon.Open();
        myCmd.ExecuteNonQuery();
   }
}

当然,您应该根据数据表上
TotalCost
列的实际数据类型调整此代码

如果
TotalCost
是数字,则需要将其转换为十进制\双精度,然后作为
myCmd.Parameters.AddWithValue(“@TotalCosts”)传递
AddWithValue无法知道如果第二个参数是字符串,则传递的是double。避免使用
数字(10,12)
是不可能的-这意味着一个包含10位数字的数字,其中12位位于小数点的右侧。。。。