【问题标题】:Casting datareader values to integer in insert statement在插入语句中将数据读取器值转换为整数
【发布时间】:2013-08-20 12:21:54
【问题描述】:

我正在使用数据读取器值构建一个插入语句,其中包含来自 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 并得到一个

“指定的强制转换无效”

错误。请帮忙。

【问题讨论】:

  • 你在哪一行得到这个错误?
  • @SonerGönül on commandInsert.ExecuteNonQuery();

标签: c# sql casting


【解决方案1】:

如果目标表中的第一列是整数列,则不应传递字符串。
在您的连接命令中,您在第一个参数周围加上单引号,这意味着您尝试传递一个字符串。因此错误。

但是你应该始终编写参数化查询,而不是尝试使用字符串连接构建 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

【讨论】:

  • 谢谢。这两个字段都允许空值。如果不使用参数化查询,我将如何处理空值或空值。插入语句看起来“此插入到 configtest 值 (,'')”并引发错误
  • 为输入数据中的 NULL 值添加了快速修复。可能需要更多检查。如果两个字段都为空怎么办?您是否打算插入一条全为空值的记录?
【解决方案2】:

将您的字符串替换为以下内容(假设您的 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)) +  "')";

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

【讨论】:

  • 谢谢。这两个字段都允许空值。我将如何满足空值或空值。 Insert 语句看起来像这样“插入到 configtest 值 (,'string')”并引发错误。
  • 如果您找到 dr.GetValue(0) 的空值,您可以插入“NULL”。然后您的插入语句将如下所示-“插入到 configtest 值 (NULL,'')
猜你喜欢
  • 2015-05-08
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2023-04-07
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多