【问题标题】:Can't Update Database from ASP.NET Webform无法从 ASP.NET Webform 更新数据库
【发布时间】:2018-01-21 11:01:40
【问题描述】:

我无法获取 ASP.NET 网络表单来更新数据库。我正在尝试编辑数据库中的现有记录。 Web 表单将记录中的数据填充到表单中。然后,用户在提交表单时更改数据并更新数据库中的记录。

问题是提交修改后的表单时,数据库中没有任何更改。我在这里做错了什么? SQL 在 MSSQL Management Studio 中运行。

谢谢。

private void SaveToDatabase ()
{
    using (SqlConnection conn = new SqlConnection (_connectionString_Bluebook))
    {
        conn.Open ();

        string sql = @"update Companies

                            set CompanyName=@CompanyName, AccountNo=@AccountNo

                            where AccountNo=" + _accountNo;

        using (SqlCommand command = new SqlCommand (sql, conn))
        {
            command.Parameters.Add (new SqlParameter ("@CompanyName", TextBox_CompanyName.Text));
            command.Parameters.Add (new SqlParameter ("@AccountNo", TextBox_Account.Text));

            command.ExecuteNonQuery ();
        }

        conn.Close ();
    }
}

【问题讨论】:

  • 您检查_accountNo 的值是否符合您的预期?该值在哪里设置?
  • 您是否 100% 确定您不会在回发时重新填充?

标签: asp.net sql-server webforms sql-update


【解决方案1】:

尝试将原始帐号的参数添加到您的查询中。下面的示例使用强类型参数来提高安全性和性能,猜测您的实际 SQL 数据类型和列长度,您应该将其更改为您的实际定义。

private void SaveToDatabase()
{
    using (SqlConnection conn = new SqlConnection(_connectionString_Bluebook))
    {
        conn.Open();

        string sql = @"update dbo.Companies

                    set CompanyName=@CompanyName, AccountNo=@AccountNo

                    where AccountNo=@OriginalAccountNo;
                    IF @@ROWCOUNT = 0 RAISERROR('Account number %s not found',16,1,@OriginalAccountNo)";

        using (SqlCommand command = new SqlCommand(sql, conn))
        {
            command.Parameters.Add(new SqlParameter("@CompanyName",SqlDbType.VarChar,100).Value = TextBox_CompanyName.Text;
            command.Parameters.Add(new SqlParameter("@AccountNo", SqlDbType.Char, 10).Value = TextBox_Account.Text;
            command.Parameters.Add(new SqlParameter("@OriginalAccountNo", SqlDbType.Char, 10).Value = _accountNo;

            command.ExecuteNonQuery();
        }

    }
}

如果该行仍未按预期更新,请确保 _accountNo 包含正确的值。

编辑:

我在 SQL 批处理中添加了一个 RAISERROR 语句来促进这一点,如果永远不会出现未找到的情况,您可以将其留在代码中。

【讨论】:

    【解决方案2】:

    如果 SQL 参数不起作用,请尝试以下方法:

    comm = new SqlCommand("update student_detail set s_name= '" + txtname.Text + "', age= "+txtage.Text+" , course=' " + txtcourse.Text + "' where roll_no = " + txtrn.Text + " ", conn);
    
    1. 尝试放置调试器并提供编译器的确切错误

    【讨论】:

    • 虽然调试器是个好建议,但我投了反对票,因为将参数化查询更改为来自不受信任的用户输入的字符串连接确实是个坏主意。
    • 嗨,Gal,更改为 concat 的建议只是为了找出问题是查询还是 sql 连接。无论如何,我从来不会对否决票感到难过:),因为这是一个改进的范围。
    • 在这种情况下,我认为最好在您的答案中提及这一点,这样它就不会留在生产代码中。我投了反对票:-)
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2021-03-15
    相关资源
    最近更新 更多