【问题标题】:Why isn't my SQL Update query working? (the row is not affected)为什么我的 SQL 更新查询不起作用? (行不受影响)
【发布时间】:2020-08-05 14:50:32
【问题描述】:

我正在使用 Visual Studio 2019 使用 ASP.NET 创建一个网站。在网络表单上,我有一些来自 SQL 表的数据,我想在单击按钮时对其进行更新。这是我单击按钮时调用的函数:

void updateUserPersonalDetails()
{
    try
    {
        SqlConnection con = new SqlConnection(strcon);
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }

        SqlCommand cmd = new SqlCommand("UPDATE member_master_tbl SET full_name=@full_name, dob=@dob WHERE member_id='" + Session["username"].ToString().Trim() + "'", con);
        cmd.Parameters.AddWithValue("@full_name", TextBoxFullName.Text.Trim());
        cmd.Parameters.AddWithValue("@dob", TextBoxDOB.Text.Trim());

        int result = cmd.ExecuteNonQuery();
        con.Close();
        if (result > 0)
        {
            Response.Write("<script>alert('Details Updated Successfully');</script>");
        }
        else
        {
            Response.Write("<script>alert('Invalid entry');</script>");
        }

    }
    catch (Exception ex)
    {
        Response.Write("<script>alert('" + ex.Message + "');</script>");
    }
}

我收到详细信息已更新的警报,但实际上它们并未更新。其他查询(如 SELECT 和 INSERT)可以正常工作,因此问题不在于连接。我尝试使用 Linq 来执行此操作,但得到了相同的结果。

【问题讨论】:

  • member_id 是数据库中的数字还是字符串类型?显示 sql 查询运行时值。
  • 请检查会话参数值。
  • 为什么不为member_id创建参数?
  • 除了上述问题,这些问题对于诊断正在发生的事情有很好的方向,我建议作为一个良好做法当你得到一个关闭连接例外,可能在 catch 甚至在 finally 中,所以你总是关闭它。
  • 有点 OT,但我建议将 "Session["username"].ToString().Trim()" 转换为参数,例如@username - 根据您的字段类型,可能存在很多问题,例如通过用户名 "'or 1=1 ;--" 进行 sql 注入

标签: c# asp.net visual-studio sql-update


【解决方案1】:

我发现如果我在 sql 查询中设置 full_name 的值,如下所示:

UPDATE member_master_tbl SET full_name= 'blabla' WHERE member_id = 'm001'

但是当我输入这样的参数时它不起作用:

UPDATE member_master_tbl SET full_name= '" + TextBoxFullName.Text + "' WHERE member_id ='m001'

参数名称正确。数据库中的值类型是 nvarchar(50)。我错过了什么?

【讨论】:

  • 在显示的任何一个版本中都没有参数...但是:文本值中是否可能有单引号或类似的?这就是为什么你应该使用一个参数的例子
【解决方案2】:

试试这个:

 // open the connect via the cmd
cmd.Connection.Open();
 //then execute
cmd.ExecuteNonQuery();


 //also you want to check for not -1 
 if (result != -1)
  {
     //query ran ok and rows were updated
  }

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?view=dotnet-plat-ext-3.1

【讨论】:

【解决方案3】:

尝试添加数据适配器。

在哪里int result = cmd.ExecuteNonQuery(); 试试这个

result = new SqlDataAdapter(); //<- Put this below your SqlConnection con = ...
result.UpdateCommand.ExecuteNonQuery();

UPDATE 需要派生自 SqlDataAdapter 的 UpdateCommand.ExecuteNonQuery() 才能获取或设置用于更新数据源中记录的 Transact-SQL 语句或存储过程。

【讨论】:

  • “数据适配器可以工作,但没有必要” - 不验证错误答案。其中使用 int result = cmd.ExecuteNonQuery() 仍然是 ExecuteNonQuery() 命令的无效类型数据类型。
  • "int is wrong datatype here" - 是错误的。 “SELECT 和 INSERT 不依赖 ExecuteNonQuery()”是错误的。此外,适配器默认情况下没有 UpdateCommand,因此您的示例是错误的。
  • ExecuteNonQuery 返回受影响的行数,为int类型。答案是错误的,因为它表明使用数据适配器会产生不同的结果。
  • ExecuteNonQuery();必须执行以更新数据库。这不是通过说 int result = cmd.ExecuteNonQuery() 来完成的,您正在为结果分配一个值,而不是执行它。此外,SqlDataAdapter 确实具有 UpdateCommand 属性。直接从制造商那里看一下。微软:docs.microsoft.com/en-us/dotnet/api/…
  • 我不是要粗鲁,但你错了。 int result = cmd.ExecuteNonQuery() 绝对会执行数据库中的命令。而且我知道有一个 UpdateCommand 属性,但是您必须为其分配一个 SqlCommand 。您的示例未分配一个,因此无法成功。
猜你喜欢
  • 2014-03-22
  • 2014-03-21
  • 1970-01-01
  • 2011-12-16
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多