C# 行删除ADO.Net、ASP.Net

C# 行删除ADO.Net、ASP.Net,c#,asp.net,ado.net,C#,Asp.net,Ado.net,我正在尝试使用联系人列表,并希望在键入某人姓名时删除其所有信息。我正在使用一个名为Contact的sql表,其中包含联系人的姓名、电子邮件和地址。我有以下代码: protected void Delete_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].Conne

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

    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与列标题名称进行比较,而不是与名称中的名称进行比较。

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

字符文字用单引号括起来,其中 使Oracle能够将它们与架构对象名称区分开来

实际上,您要做的是使用sqlcommand参数,然后需要在sql语句中使用@[ParameterName]来使用参数名

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

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

您的代码有几个严重的问题

  • 您的连接从未关闭或释放。使用将关闭和处置数据库对象的块,即使出现错误

  • 您正在连接一个字符串,以获取Sql语句,从而冒着Sql注入和数据库损坏的风险

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

  • string delete = "DELETE FROM Contact WHERE Name = @Name";
    
  • 您正在使用.AddWithValue,它将参数名和参数值作为参数。您已经提供了整个Sql语句作为@Name的值。这应该是NameToDelete.Text

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

  • 如果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
                }
            }
        }
    }
    

  • 如果您添加了参数,这是正确的,请确保您使用它!如果你不打算使用它,有很多代码是没有意义的@AntonioRodriguez你是对的,我意识到这些行之后的参数用法。出于安全原因,首选的方法当然是使用参数(反对sql注入)。好吧,我把它弄得有点乱,我让它使用parameters.AddWithValue(“@nametodelet”,nametodelet.Text);这样看起来干净多了。谢谢