我正在使用数据读取器值使用excel文件中的数据构建一个insert语句。 excel文件datareader始终只有一条记录。目标表中有两列,第一列是int类,第二列是varchar。
while (dr.Read())
{
string insertstring = @"insert into configtest values
('" + dr.GetValue(0) + "','"
+ dr.GetValue(1) + "')";
}
SqlCommand commandInsert = new SqlCommand(insertstring, conn);
commandInsert.ExecuteNonQuery();
我收到错误
“将varchar类型转换为数字时出错。
我尝试将第一个值转换为int类型并获取
“指定的演员表无效”
错误。请帮助解决这个问题。
答案 0 :(得分:4)
如果目标表中的第一列是整数列,则不应传递字符串 在连接命令中,您在第一个参数周围放置单引号,这意味着您尝试传递字符串。因此错误。
但是,您应该始终编写参数化查询,而不是尝试使用字符串连接来构建sql命令
string insertstring = @"insert into configtest values (@p1, @p2)";
while (dr.Read())
{
SqlCommand commandInsert = new SqlCommand(insertstring, conn);
if(dr.IsDBNull(0))
commandInsert.Parameters.AddWithValue("@p1", DBNull.Value);
else
commandInsert.Parameters.AddWithValue("@p1", Convert.ToInt32(dr[0]));
if(dr.IsDBNull(1))
commandInsert.Parameters.AddWithValue("@p2", DBNull.Value);
else
commandInsert.Parameters.AddWithValue("@p2", dr[1].ToString());
commandInsert.ExecuteNonQuery();
}
如果您的字符串值包含单引号,此方法将使您免受Sql Injection和语法错误的影响。
最后请注意,请记住,当DataReader打开时,除非在连接字符串中使用MultipleActiveResultSets=True,否则不能将其连接用于其他活动(ExecuteNonQuery)
答案 1 :(得分:1)
用以下内容替换你的字符串(假设你的dr.GetValue(0)
是int。)
string insertstring = @"insert into configtest values
(" + dr.GetValue(0) + ",'"
+ dr.GetValue(1) + "')";
刚删除dr.GetValue(0)
周围的引号。由于它是int类型,因此不需要引号。
修改强>
要插入空值,您可以在查询本身中检查空值 -
string insertstring = @"insert into configtest values
(" + (dr.GetValue(0) == null ? System.Data.SqlTypes.SqlInt32.Null : dr.GetValue(0)) + ",'"
+ (dr.GetValue(1) == null ? string.Empty : dr.GetValue(1)) + "')";
虽然这不是一个完美的解决方案,但可以解决方法!!!!