【问题标题】:ExecuteNonQuery returning value of 0 when successfully deleting a record成功删除记录时,ExecuteNonQuery 返回值为 0
【发布时间】:2012-03-18 22:25:27
【问题描述】:

从 sql server 中删除一行时,我在 Asp.net 中的 C# 代码有一个小问题。我正在使用 ExecuteNonQuery 来确定我向页面呈现的消息。如果 ExecuteNonQuery 返回 1,那么我会显示成功消息。我被卡住的地方是我有相同的逻辑来添加记录和更新记录,我的代码工作正常。代码见下文。

private void Delete_row(string ImageId)
    {
        string sSQL = "delete FROM dbo.Image_library_UK_temp where Image_id=" + ImageId;
        using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
        {
            try
            {

                //delete the row from db
                dbConnection.Open();
                SqlCommand command = new SqlCommand(sSQL, dbConnection);
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 1024;
                command.ExecuteNonQuery();

                int rowsAffected = command.ExecuteNonQuery();
                if (rowsAffected == 1)
                {

                    messagepanel1.ShowSuccessMessage("The image " + txtImgTitle.Text + "has been deleted from the system.");
                    DisableValidation();
                }

            }
            catch (Exception ex)
            {
                messagepanel1.ShowErrorMessage("Error: Deletion unsuccessful");
            }

            Session.RemoveAll();
            generateTable(false);

        }
    }

当前受影响的行返回 0。这是一个简单的 SQL 语句,因此我的 sql 是用 C# 硬编码的,我没有使用存储过程。

有什么想法可以让我完成这项工作吗?

【问题讨论】:

  • 你的代码很容易被SQL注入,这是一个非常严重的安全问题!
  • 你试过直接在sql server上运行查询吗?有用吗?
  • 本网站仅供内部使用,否则我同意。
  • @nickgowdy - 即使它是一个内部站点,使用准备好的语句也会带来执行计划重用、标准化编码实践、类型安全、简化调试的好处......我可以继续,但让我们只是说没有一个很好的例子不使用它们。

标签: c# asp.net sql sql-server-2008


【解决方案1】:

您正在执行该命令两次。

command.ExecuteNonQuery();
int rowsAffected = command.ExecuteNonQuery();

第一行将删除该行并返回 1,但您忽略了返回值。 第二行将再次执行DELETE 语句,但不会删除任何内容,因为没有更多行满足给定条件;因此,rowsAffected 将为零。

此外,正如 cmets 中已经提到的,您的代码容易受到 sql 注入的影响。考虑改用prepared statements

【讨论】:

  • 谢谢,我没有注意到那个错误。当 Stackoverflow 允许我时,我会将其标记为正确:(
  • 顺便说一句,如果您对创建点和更新点使用相同的代码,则还需要在此处进行编辑。否则,您的 create 将插入 sam 记录两次。
猜你喜欢
  • 2019-03-24
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多