行删除 ADO.Net、ASP.Net

Row Deletion ADO.Net, ASP.Net

我正在尝试使用联系人列表,并希望在我输入某个人的姓名时删除其所有信息。我正在使用 sql table -命名的联系人-,其中包含联系人的姓名、电子邮件和地址。我有以下代码:

    protected void Delete_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString);
        con.Open();
        string delete = "DELETE FROM Contact WHERE Name =" + NameToDelete.Text;
        SqlCommand cmd = new SqlCommand(delete, con);



        try
        {
            cmd.Parameters.AddWithValue("@Name", delete);
            cmd.ExecuteNonQuery();
            Response.Redirect("ViewContacts.aspx");
        }
        catch(Exception ex)
        {
            Response.Write(ex);
        }


    }

当我使用它时,它似乎将名称列与我输入的名称进行比较。因此名称 Bill 将与 header 名称列进行比较,而不是名称中的内容。

您需要在 var(char) 类型的值周围使用单引号。如果您不使用引号,它会认为您引用的是列名而不是值。 它对所有数据库都有效,以下来自 oracle 文档:

character literals are enclosed in single quotation marks, which enable Oracle to distinguish them from schema object names.

https://docs.oracle.com/cd/A87860_01/doc/server.817/a85397/sql_elem.htm

string delete = "DELETE FROM Contact WHERE Name ='" + NameToDelete.Text + "'";

实际上你想做的是使用sql命令参数,那么你需要在sql语句中使用@[ParameterName]来使用参数名称。

string delete = "DELETE FROM Contact WHERE Name = @Name";

您的问题似乎是您在两个实例中使用了变量 delete。首先用于创建正确的命令,其次用于创建参数值,这是错误的。在参数值中,您可能必须使用要删除的值。

你的代码有几个严重的问题。

  1. 您的连接永远不会关闭或处置。使用 Using 块,即使出现错误也会关闭和处理数据库对象。

  2. 您正在连接一个字符串以使您的 Sql 语句冒着 Sql 注入和损坏数据库的风险。

  3. 当 Sql 语句中没有参数时,您正在向命令添加参数。

  4. 您正在使用 .AddWithValue ,它将参数名称和参数值作为参数。您已提供整个 Sql 语句作为 @Name 的值。这应该是 NameToDelete.Text.

  5. 不要使用 .AddWithValue。使用 .Add(parameter Name, Sql data type).Value = 参数值。这可以加快查询速度并避免数据库中的类型不匹配。

  6. 如果 name 是您的主键,您可以,但如果不是,您应该通过主键删除或发送 Where 子句中的所有值。

    protected void Delete_Click(object sender, EventArgs e)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString))
        {
    
            string delete = "DELETE FROM Contact WHERE Name = @Name;"; //no single quotes to worry about
            using (SqlCommand cmd = new SqlCommand(delete, con))
            {
                cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = NameToDelete.Text; //just guessed at the VarChar - check your database for type
                try                  
                {           
                    con.Open();
                    cmd.ExecuteNonQuery();
                    Response.Redirect("ViewContacts.aspx");
                }
                catch (Exception ex)
                {
                    Response.Write(ex.Message); //ex by itself, will get you nothing but the fully qualified name of Exception
                }
            }
        }
    }