【问题标题】:deleting row from database using C# [closed]使用 C# 从数据库中删除行 [关闭]
【发布时间】:2014-02-27 07:14:58
【问题描述】:

为什么这段代码不删除行并显示错误信息

 protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            String connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid ('"+cids.Text+"')",con);
            con.Open();
            cmd.ExecuteNonQuery();
            Response.Redirect("done.aspx");
            con.Close();
        }
        catch (SqlException)
        { Label1.Text = "error";
        }
    }

【问题讨论】:

  • 它显示什么错误信息? (提示:将catch(SqlException) 更改为catch(SqlException e) 并发布e 的值)
  • 我怀疑你的 SQL 有点生疏了。也许您应该查阅手册:dev.mysql.com/doc/refman/5.7/en/delete.html

标签: c# mysql asp.net


【解决方案1】:

使用 SQL 参数,您的代码完全不安全,修复它!

您的意思是使用 SQL IN 子句吗?那将是“WHERE cid IN (...)”,或者只是带有“WHERE cid = ...”的单个值

请参阅Parameterize an SQL IN clause 以在 IN 子句中使用参数

【讨论】:

  • 现在使用这个 SqlCommand cmd = new SqlCommand("DELETE from [course] where cid IN ('" + cids.Text + "')", con);
  • @user3359284 TFD 提出的观点是,您严格通过创建字符串构建的 任何 查询都有可能导致问题,包括可能将非常不需要的查询注入通过您创建的这个不安全的漏洞您的数据库。例如,想象一下cids.Text"); drop table course"...您的查询不太可能让您满意!使用正确创建参数化查询可以避免这种情况。
【解决方案2】:
SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid ('"+cids.Text+"')",con);

应该是:

SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid IN ('"+cids.Text+"')",con);

注意 cid 和 (

假设您应该使用 in 因为括号。但是,如果您只想比较一个值,那么 = 应该可以解决问题。

另外,正如@TFD 所说,您应该使用参数化 SQL。此代码将允许 SQL 注入攻击。

【讨论】:

  • 现在移动到下一页但不会从数据库中删除行
  • @user3359284 你遇到了什么错误?
  • 确实从数据库中删除行但移动到下一页
  • 我不明白。现在它确实删除了该行? SqlException 的值是多少?
  • @user3359284 请将catch(SqlException) 更改为catch(SqlException e) 并发布e 的值
【解决方案3】:

好的,您是否曾经在某处阅读过 SQL 语法?或者你只是随便往墙上扔东西,然后希望它能粘住?

cid ('"+cids.Text+"')",

让我们忽略这样一个事实,即这是被解雇的最佳方式 - 任何人都可以在您的数据库中执行他想要的任何 RANDOM SQL。坏消息 - 当您不检查输入时会发生 (cids.Text.

但粗暴地说,如果我在文本框中有 55,则翻译为:

cid ('55')

好的,这是从哪里来的?

() 初始化 IN 子句,但没有 IN。

SQL 语法说质量是 = - 那就是 cid = 55

那么数字不是字符串(不需要'55',它是55)。

正确的是

cid = 55

拜托,一分钟的文档检查有时是学习一门语言的好方法。有助于不要将随机语句扔到编译器中,希望它们是正确的。

【讨论】:

    【解决方案4】:

    你忘记使用=

    SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid ('"+cids.Text+"')",con);
    

    这条线应该是

    SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid ='"+cids.Text+"'",con);
    

    或使用WHERE cid IN (...)

    SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid IN ('"+cids.Text+"')",con);
    

    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                String connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                SqlConnection con = new SqlConnection(connectionString);
                SqlCommand cmd=new SqlCommand("DELETE  from [course] where cid IN ('"+cids.Text+"')",con);
                con.Open();
                cmd.ExecuteNonQuery();
                Response.Redirect("done.aspx");
                con.Close();
            }
            catch (SqlException ex)
            { 
             Label1.Text = "error";
            }
        }
    

    【讨论】:

    • 反对者请解释
    • 它不会从数据库中删除行但控制转到下一页
    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多