删除操作函数如下所示:
protected void btnDlt_Click(object sender, EventArgs e)
        {
            //if (this.txtPID.Text == "")
            //{
            //    SqlConnection con = personOperate.createCon();
            //    con.Open();
            //    SqlCommand cmd = new SqlCommand("delete from person where pID=''", con);
            //    cmd.ExecuteNonQuery();
            //    Response.Write("字段为空");
            //    return;
            //}
            if (!this.CustomValidator1.IsValid)
            {
                if (personOperate.delOperate(this.txtPID.Text))
                {
                    Response.Write("删除成功");
                    this.fillDg();
                }
                else
                {
                    Response.Write("删除失败");
                }
            }
        }       
public static bool delOperate(string pID)
        {
            try
            {                SqlConnection con = personOperate.createCon();
                con.Open();
                SqlCommand cmd = new SqlCommand("delete from person where pID='"+pID+"'", con);
                cmd.ExecuteNonQuery();
                return true;
            }
            catch
            {
                return false;
            }
        }程序实现的功能就是在VS中可以实现对数据库中person表中记录的操作。
现在的问题是在程序运行时,如果我在this.txtPID这个文本控件中输入要删除记录的pID号,那么程序正常运行。
可现在数据库表中有个记录的pID为空值。
当我在该文本框中不填任何内容时点删除的话,该记录是删除不掉的。
可如果我增加了如程序代码中那段注释掉的内容,就可以成功删除。
请高手解释一下这是为什么,实在想不通。
数据库表的结构如下:
pID varchar no 10
personName varchar no 20
personSex varchar no 2

解决方案 »

  1.   

    忘了说了 
    CustomValidator1对pID文本框加的一个自定义验证控件
    它的服务器端程序为
    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
            {
                string pID = args.Value;
                if (personOperate.findPerson(pID))
                {
                    args.IsValid = false;
                }
                else
                {
                    args.IsValid = true;
                }
            }
      

  2.   

    呵呵,空的写法用null. 另外检测是否为空,不要用操作,用read就可以了
      

  3.   

    其中findPerson内容如下
     public static bool findPerson(string pID)
            {            SqlConnection con = personOperate.createCon();
                con.Open();
                SqlCommand cmd = new SqlCommand("select count(*) from person where pID='" + pID + "'", con);
                int count = Convert.ToInt32(cmd.ExecuteScalar());
                if (count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }        }
    personOperate是自己定义的一个操作类,实现对表中数据的操作。
      

  4.   

    最好是让PID做主键,已防止空值的出现
      

  5.   


    加个trim()试试
    不行就用参数操作
      

  6.   

    有可能是pID!=''。但不管怎么说你删除一条记录的时候应该用主键作为条件。这样即唯一又不可能为空。
      

  7.   

    谢谢大家回答
    我没有把pID设置为主键我现在的目的就是要删除pID为空的那条记录
      

  8.   

    if (!this.CustomValidator1.IsValid)
                {
                    if (personOperate.delOperate(this.txtPID.Text))
                    {
                        Response.Write("删除成功");
                        this.fillDg();
                    }
                    else
                    {
                        Response.Write("删除失败");
                    }
                }
    我估计是这个地方的错误
    我在if (!this.CustomValidator1.IsValid)和 if (personOperate.delOperate(this.txtPID.Text))设置两个断点
    调试时执行完if (!this.CustomValidator1.IsValid)就直接跳到最后面了
    不执行
     if (personOperate.delOperate(this.txtPID.Text))
                    {
                        Response.Write("删除成功");
                        this.fillDg();
                    }
                    else
                    {
                        Response.Write("删除失败");
                    }
    这段代码。
      

  9.   

    我调试了一下发现如果我在pID文本框什么都不输入直接执行删除的话程序并不会执行到自定义验证控件的服务器端验证程序。
    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
            {
                string pID = args.Value;
                if (personOperate.findPerson(pID))
                {
                    args.IsValid = false;
                }
                else
                {
                    args.IsValid = true;
                }
            }
    即这段代码不会执行,而如果我在pID文本框中输入一个特定的pID的话就会执行到这里。请问是不是自定义验证控件不验证空值啊??
      

  10.   

    那你觉得我该怎么改一下呢?另外说明一下,如果加上我注释中的那段代码的话程序运行是正常的,可以删除表中pID为空的记录。
    而如果把那段代码注释掉则才是不能删除pID为空的记录。
      

  11.   

    delete from Product where productID=null