C# 为什么我的SQL更新查询不起作用?(该行不受影响)

C# 为什么我的SQL更新查询不起作用?(该行不受影响),c#,asp.net,visual-studio,sql-update,C#,Asp.net,Visual Studio,Sql Update,我正在使用Visual Studio 2019使用ASP.NET创建一个网站。在webform上,我有一些来自SQL表的数据,我想在单击按钮时对其进行更新。以下是单击按钮时调用的函数: void updateUserPersonalDetails() { try { SqlConnection con = new SqlConnection(strcon); if (con.State == ConnectionState.Closed)

我正在使用Visual Studio 2019使用ASP.NET创建一个网站。在webform上,我有一些来自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来实现,但得到了相同的结果。

尝试添加数据适配器

其中int result=cmd.ExecuteNonQuery; 试试这个

result = new SqlDataAdapter(); //<- Put this below your SqlConnection con = ...
result.UpdateCommand.ExecuteNonQuery();
update需要从SqlDataAdapter派生的UpdateCommand.ExecuteOnQuery来获取或设置用于更新数据源中记录的Transact-SQL语句或存储过程。

请尝试以下操作:

 // 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
  }

我发现,如果我在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'

参数的名称是正确的。数据库中的值类型是nvarchar50。我缺少什么?

数据库中的成员id是数字还是字符串类型?显示sql查询运行时值。请检查会话参数值。为什么不为member_id创建一个参数?除了上面的问题之外,我建议在出现异常时关闭连接,这是一个很好的做法,因为这些问题有助于诊断发生了什么,可能是在catch中,甚至是在finally so中,您总是可以关闭它。有一点OT,但我建议使用Session[username]。ToString.Trim转换为参数,例如@username-根据您的字段类型,可能存在很多问题,例如通过username'或1=1进行sql注入-数据适配器可以工作,但不是必需的-不会验证错误答案。其中as using int result=cmd.ExecuteNonQuery仍然是ExecuteNonQuery命令的无效类型数据类型。int是此处的错误数据类型-是错误的。选择和插入不依赖ExecuteOnQuery是错误的。此外,默认情况下适配器没有UpdateCommand,因此您的示例是错误的。ExecuteOnQuery返回受影响的行数,它是int类型。答案是错误的,因为它表明使用数据适配器将产生不同的结果;必须执行以更新数据库。这并不是说int result=cmd.ExecuteNonQuery,而是说您正在为结果赋值,而不是执行它。此外,SqlDataAdapter确实具有UpdateCommand属性。看看这里,直接从制造商那里。微软:我不是想粗鲁,但你错了。int result=cmd.ExecuteNonQuery将绝对执行数据库中的命令。我知道有一个UpdateCommand属性,但是你必须给它分配一个SqlCommand。您的示例没有分配一个参数,因此无法成功。如何检查/修改此设置?显示的两个版本中都没有参数。。。但是:文本值中是否有一个引用或类似的引用?这就是为什么要使用参数的示例