【问题标题】:SqlCommand doesn't UPDATE and DELETE database when used in ASP.NETSqlCommand 在 ASP.NET 中使用时不会更新和删除数据库
【发布时间】:2017-04-14 06:25:09
【问题描述】:

在使用 ASP.NET Web 表单时,我在使用数据库中的 UPDATEDELETE 数据时遇到问题,代码在 Windows 表单中运行良好,所以我不知道我做错了什么。该代码假设使用新的编辑数据更新 Gridview,但是当我单击编辑按钮时,gridview 和数据表都没有发生任何事情。

这只是一个没有安全要求的练习,所以我只想知道如何首先让它工作。

protected void Edit_btn_Click(object sender, EventArgs e)
{
        if (sqlCon.State == ConnectionState.Closed)
        {
            sqlCon.Open();
        }

        SqlCommand command = new SqlCommand();
        command.Connection = sqlCon;

        command.CommandText = ("UPDATE WareHouse SET [Name] = '" + Name_Field.Text + "' WHERE [Number] = '" + selectedName + "'");
        command.ExecuteNonQuery();

        command.CommandText = ("UPDATE WareHouse SET [Number] = '" + Number_Field.Text + "' WHERE [Number] = '" + selectedName + "'");
        command.ExecuteNonQuery();

        command.CommandText = ("UPDATE WareHouse SET [Storage] = '" + Storage_Field.Text + "' WHERE [Number] = '" + selectedName + "'");
        command.ExecuteNonQuery();

        command.CommandText = ("UPDATE WareHouse SET [Shelf] = '" + Shelf_Field.Text + "' WHERE [Number] = '" + selectedName + "'");
        command.ExecuteNonQuery();

        command.CommandText = ("UPDATE WareHouse SET [Brand] = '" + Brand_Field.Text + "' WHERE [Number] = '" + selectedName + "'");
        command.ExecuteNonQuery();

        SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM WareHouse", sqlCon);
        DataTable ds = new DataTable();
        ad.Fill(ds);                    // Fill t with data from Adapter a

        GridView1.DataSource = ds; // Get data from Source t 
        GridView1.DataBind();
    }

用于删除数据

    protected void Remove_btn_Click(object sender, EventArgs e)
    {
        if (sqlCon.State == ConnectionState.Closed)
        {
            sqlCon.Open();
        }

        SqlCommand command = new SqlCommand();
        command.Connection = sqlCon;
        command.CommandText = "DELETE FROM WareHouse WHERE [Name] = '" + Name_Field.Text + "' AND [Number] = '" + selectedNumber + "' AND [Storage] = '" + selectedStorage + "' AND [Shelf] = '" + selectedShelf + "' AND [Brand] = '" + selectedBrand + "'";
        command.ExecuteNonQuery();

        clear();
        showData();
    }

除了这 2 个函数之外,还有另外两个函数可以从数据库中添加和搜索,它们也使用 SqlCommand,它们工作正常,没有问题。我的查询有问题吗?

【问题讨论】:

  • !!!警告 !!! Sql注入攻击......
  • 不工作是什么意思?
  • 您知道一次可以更新多个列吗?此外,这是一个等待发生的 SQL 注入的可怕示例(请阅读参数)。最后,看起来您正在尝试共享一个连接对象,而且效果很少。这些都不是您当前的问题,但仍然...
  • 您永远不应该以这种方式创建 SQL 语句:SQL 注入。显示任何错误?你确定代码曾经被执行过吗?
  • 你确定这个"' WHERE [Number] = '" + selectedName + "'",因为数字被包裹在单引号中

标签: c# sql-server sqlcommand


【解决方案1】:

由于您将 [Number] 更新为 Number_Field.Text 的值,然后与 where 子句中的 selectedName 进行比较,因此不会更新 Storage、Shelf 和 Brand。

将所有这些带参数的 SQL 代码放在 SP 中并从 ASP.Net 代码中调用它,对您有很大帮助。

【讨论】:

    【解决方案2】:

    好的。我在学习 ASP.NET 时也遇到过这个问题。 但我有一点不同的环境。 我有一个数据网格可供使用,数据网格内容中的任何更新都应在单击更新按钮后反映在 DB 表中。

    所以我有以下查询来填充网格。

    Try
            Dim UpperCase As String = UCase(HostnameTextBox.Text)
    
            Dim sql As String = "select * from HOST_DETAILS where upper(HOSTNAME) like '%" + UpperCase + "%'"
            da = New OracleDataAdapter(sql, conn)
            ds.Clear()
            da.Fill(ds, "TEST")
            DataGridView1.DataSource = ds.Tables(0)
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
    

    和下面的更新表格上的Update按钮点击一下。

    conn.Open()
    
        Try
            Dim ocb As New OracleCommandBuilder
            ocb = New OracleCommandBuilder(da)
            da.Update(ds, "TEST")
            MessageBox.Show("Information Updated")
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
    
    
        End Try
        conn.Close()
    

    还要确保 DataAdapter da 是全局的,并且是在公共类之后定义的,因此可以从两者访问。

       Dim da As New OracleDataAdapter
    

    希望这会有所帮助。

    【讨论】:

    • VB代码,但改语法不会太麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多