无法将参数值从String转换为Decimal

时间:2012-08-20 18:00:26

标签: c# .net sql-server-2008 sqlconnection sqlcommand

使用以下代码将csv导入我的sql server表

SqlCommand nonqueryCommand = myConnection.CreateCommand();
nonqueryCommand.CommandText = 
                 "INSERT INTO MYTABLE VALUES(@num1, @num2,@num3,@num4)";

nonqueryCommand.Parameters.Add("@num1",SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num2", SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num3", SqlDbType.Decimal);
nonqueryCommand.Parameters.Add("@num4", SqlDbType.Decimal);

nonqueryCommand.Parameters["@num1"].Value = crntRecord[0];
nonqueryCommand.Parameters["@num2"].Value = crntRecord[1];
nonqueryCommand.Parameters["@num3"].Value =crntRecord[3];
nonqueryCommand.Parameters["@num4"].Value = crntRecord[4];

nonqueryCommand.ExecuteNonQuery();

当我在ExecuteNonQuery执行代码时,DDL中参数3和4的类型为十进制(9,6),我得到以下异常

  

无法将参数值从String转换为Decimal。

请帮我找出问题tnx。

修改

crntRecord [3]中的值看起来像

enter image description here

4 个答案:

答案 0 :(得分:3)

假设crntRecord是一个字符串数组,您需要先将字符串解析为小数。

前:

nonqueryCommand.Parameters["@num3"].Value = decimal.Parse(crntRecord[3].ToString());

请注意,如果crntRecord[3]不能解析为小数,则会抛出异常;如果这种情况可能发生,请改为decimal.TryParse()

答案 1 :(得分:3)

编辑使用更安全的解析方法

您的字符串包含您需要剥离的引号。尝试

decimal num3;
bool isDecimal = decimal.TryParse(crntRecord[3].Trim(new []{'\"'}), out num3);
if(isDecimal)
    nonqueryCommand.Parameters["@num3"].Value = num3;

我建议对所有小数使用此方法,这意味着将此逻辑放在可重用的函数中将是一个上升的重构。

答案 2 :(得分:1)

尝试

nonqueryCommand.Parameters["@num1"].Value = Convert.ToDecimal(crntRecord[0]));
nonqueryCommand.Parameters["@num2"].Value = Convert.ToDecimal(crntRecord[1]);
nonqueryCommand.Parameters["@num3"].Value =Convert.ToDecimal(crntRecord[3]);
nonqueryCommand.Parameters["@num4"].Value = Convert.ToDecimal(crntRecord[4]);

答案 3 :(得分:-1)

使用

nonqueryCommand.Parameters.AddWithValue("@num1", crntRecord[0]);