0

我正在使用数据读取器值构建一个包含来自 excel 文件的数据的插入语句。excel 文件数据阅读器总是只有一条记录。目标表中有两列,第一列是 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 并得到一个

“指定的演员表无效”

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

4

2 回答 2

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 注入和触发的语法错误的影响。

最后一点,请记住,当 DataReader 打开时,您不能将其连接用于其他活动 (ExecuteNonQuery),除非您在连接字符串中使用MultipleActiveResultSets=True

于 2013-08-20T12:25:10.893 回答
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)) +  "')";

虽然这不是完美的解决方案,但可以解决问题!!!!

于 2013-08-20T12:24:59.683 回答