4

我使用以下代码将 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();

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

无法将参数值从字符串转换为小数。

请帮我找出问题tnx。

编辑

crntRecord[3] 中的值看起来像

在此处输入图像描述

4

4 回答 4

3

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

你的字符串有你需要去掉的引号。尝试

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

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

于 2012-08-20T18:31:53.793 回答
3

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

前任:

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

crntRecord[3]请注意,如果不能解析为小数,这将引发异常;如果这是可能发生的情况,请decimal.TryParse()改为调查。

于 2012-08-20T18:03:47.060 回答
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]);
于 2012-08-20T18:03:18.753 回答
-1

利用

nonqueryCommand.Parameters.AddWithValue("@num1", crntRecord[0]);
于 2012-08-20T18:04:10.640 回答