【问题标题】:Same record is being inserted multiple times同一条记录被多次插入
【发布时间】:2013-05-16 14:29:54
【问题描述】:

每当我向数据库中插入一条记录时,该记录就会被添加 3 次。

try
{
   con.Open();

   object addedkey = cmd.ExecuteScalar();

   if ((addedkey != null && (addedkey != DBNull.Value)))
   {
      addedkey = Convert.ToInt32(cmd.ExecuteScalar());
   }

   added = cmd.ExecuteNonQuery();

   lblResult.Text = added.ToString() + " record opgeslagen.";
   lblResult.Text = addedkey.ToString();
}

但是当我注释掉 ExecuteScalarExecuteNonQuery 时,一切正常。所以如果我注释掉两者之一,记录将被插入两次。

这在我添加了一个与插入命令无关的删除按钮后开始发生。

有人知道这是什么原因吗?

提前致谢。 :)

【问题讨论】:

  • 这个命令好像执行了三遍。
  • 你能发布你的 cmd.executenonquery 方法吗,从你的代码中我觉得你正在根据自定义需求覆盖这些函数。

标签: asp.net sql sql-server gridview


【解决方案1】:

每次对命令运行 'Execute...()' 方法时,您都在执行插入操作。您在代码中运行了 3 次不同的时间,因此插入了 3 条记录。

    object addedkey = cmd.ExecuteScalar(); //you run the insert command here
    if ((addedkey != null && (addedkey != DBNull.Value)))
    {
        addedkey = Convert.ToInt32(cmd.ExecuteScalar());//you run the insert command here
    }
    added = cmd.ExecuteNonQuery();//you run the insert command here
    lblResult.Text = added.ToString() + " record opgeslagen.";
    lblResult.Text = addedkey.ToString();

【讨论】:

  • 在其他地方添加删除命令的代码之前,我没有遇到这个问题。
  • 您可以发布您使用的查询吗?
  • 字符串插入SQL; insertSQL = "INSERT INTO Deelnemer ("; insertSQL += "Naam, Tussenvoegsel, Achternaam)"; insertSQL += "VALUES ("; insertSQL += "@Naam, @Tussenvoegsel, @Achternaam); SELECT scope_identity(); ";
  • 是的,您的查询很好。我不确定为什么您的删除命令会影响这一点,但您的代码肯定会连续三次运行插入查询。
【解决方案2】:

你执行了 3 次。所以真的,你需要在第一次执行后重构代码。

你可以改变

addedkey = Convert.ToInt32(cmd.ExecuteScalar());

对此 - 这将阻止第二次执行:

addedkey = Convert.ToInt32(addedKey);

并改变这个:

added = cmd.ExecuteNonQuery();

对此 - 这将阻止第 3 次执行(这是假设 added 是一个 int,并且是您执行的返回。

added = addedKey;

如果added 实际上是boolean,则将其设置在您的if 中,因为它已被您的if 语句验证

I.E

{
    addedkey = Convert.ToInt32(addedKey);//you run the insert command here
    added = true;
}

【讨论】:

  • 我的老师告诉我使用 executescalar 来获取刚刚添加的记录的标识,并使用 executenonquery 来显示受影响的行,然后我必须将其显示在标签上。所以“added”是受影响的行,“addedkey”是刚刚创建的记录的标识。
  • 那么你需要改变你的select语句。这需要返回一个 ID,因此假设您的返回值称为 @id,请将“SELECT @id = SCOPE_IDENTITY()”添加到您的 SQL 语句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2016-12-31
  • 2020-10-06
  • 2013-03-26
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多