使用以下代码将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]中的值看起来像
答案 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]);