在insert语句中将datareader值转换为整数

时间:2013-08-20 12:21:54

标签: c# sql casting

我正在使用数据读取器值使用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类型并获取

  

“指定的演员表无效”

错误。请帮助解决这个问题。

2 个答案:

答案 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)) +  "')";

虽然这不是一个完美的解决方案,但可以解决方法!!!!