首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请问大家是如何一次删除一千条数据的?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • marist
    • 等级:
    发表于:2008-05-05 23:56:18 楼主
    如题。
    打个比方:页面上用 CheckBoxList 绑定了当前所有的用户,我勾选中了其中的1000个用户,然后按下删除按钮,大家通常都是怎样去删除掉这1000个用户的呢?请阐明你的思路,最好列出简单的代码,我使用的是 .net2.0 + Sql Server2000 ,谢谢。
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 00:09:121楼 得分:0
    很多记录处理的话,
    应当根据某一条件(如成绩低于60分,或价格高于90等),不会根据ID或名称;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • txgaozhao
    • 等级:
    发表于:2008-05-06 01:42:582楼 得分:0
    的确是很头疼的问题,关注中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 05:03:423楼 得分:0
    如果不用考虑事务的问题,也就是说就删到第101个出错,前100个还是删除成功的话

    我一般用拼接SQL语句,然后执行一次 cmd.ExecuteNonQuery();全部删除

    C# code
    string whereClause = string.Empty; foreach (遍历CheckBoxList) { if (选中) { if (whereClause == string.Empty) whereClause += "'" + 取值 + "'"; else whereClause += ",'" + 取值 + "'"; } } if (whereClause != string.Empty) { SqlConnection cn = new SqlConnection(...); string strSQL = "delete from mytable where id in (" + whereClause + ")"; SqlCommand cmd = new SqlCommand(strSQL, cn); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 05:12:144楼 得分:0
    我比较喜欢 在勾选时,做一次AJAX请求,置该数据的删除位.(state 字段 某一位为删除位)

    提交时, 一条SQL语句,删除标识位为删除的记录...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 05:48:275楼 得分:0
    引用 4 楼 mrshelly 的回复:
    我比较喜欢 在勾选时,做一次AJAX请求,置该数据的删除位.(state 字段 某一位为删除位)

    提交时, 一条SQL语句,删除标识位为删除的记录...


    建立一千次数据连结,再释放一千次 ,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 06:31:476楼 得分:0


    引用 4 楼 mrshelly 的回复:
    我比较喜欢 在勾选时,做一次AJAX请求,置该数据的删除位.(state 字段 某一位为删除位)

    提交时, 一条SQL语句,删除标识位为删除的记录...



    I admire you ... hahaha
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 07:53:577楼 得分:0
    引用 3 楼 amandag 的回复:
    如果不用考虑事务的问题,也就是说就删到第101个出错,前100个还是删除成功的话

    我一般用拼接SQL语句,然后执行一次 cmd.ExecuteNonQuery();全部删除


    C# code
            string whereClause = string.Empty;

            foreach (遍历CheckBoxList)
            {

                if (选中)
                {
                    if (whereClause == string.Empty)
                        whereClause += "'" + 取值 + "'";
        …



    用遍历的话效率的确可能有点问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysn1314
    • 等级:
    发表于:2008-05-06 07:57:578楼 得分:0
    跟3楼一样。拼个ID字符串用 , 隔开,删除时 where id in (..)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JustLovePro
    • 等级:
    发表于:2008-05-06 08:12:569楼 得分:0
    其实这个不只是批量删除的问题,只要是批量DML作业,都应该考虑
    服务器的作业频繁度~。
    比如有一个excel档,里面有几千条甚至几万条记录,要insert到
    DB中,如何作业?如果是循环插入,是否会由于频繁操作server
    导致一些问题~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 08:51:3410楼 得分:0
    用一条语句提交。不可用程序循环
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • badtank
    • 等级:
    发表于:2008-05-06 09:01:1611楼 得分:0
    delete from table where id in (id1,id2,id3...and so on)
    this is better way.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:06:0612楼 得分:0
    引用 3 楼 amandag 的回复:
    如果不用考虑事务的问题,也就是说就删到第101个出错,前100个还是删除成功的话

    我一般用拼接SQL语句,然后执行一次 cmd.ExecuteNonQuery();全部删除


    C# code
            string whereClause = string.Empty;

            foreach (遍历CheckBoxList)
            {

                if (选中)
                {
                    if (whereClause == string.Empty)
                        whereClause += "'" + 取值 + "'";
        …


    我不觉得 效率 低, 1000 条数据,很快,刷一下就过去了。

    如果是 10万条数据,楼主起不是要 走人。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:10:0613楼 得分:0
    还可以把你勾选的所有用户id拼成1,2,3,4..这样的东西..传给一个存储过程去处理.


    4楼的方法不敢苟同-_-!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • khijfv2008
    • 等级:
    发表于:2008-05-06 09:11:2914楼 得分:0
    三楼方法,可以学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:11:3115楼 得分:0
    引用 11 楼 badtank 的回复:
    delete from table where id in (id1,id2,id3...and so on)
    this is better way.

    用这个就好了饿
    括号里面根据选中结点直接拼接,不过别忘了用StringBuilder
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:32:5316楼 得分:0
    delete from table where id in (id1,id2,id3...and so on) 
    最好用构造存储过程。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:44:5917楼 得分:0
    string s = "";
            foreach (ListItem item in CheckBoxList1.Items)
            {
                if (item.Selected == true)
                {
                    s = item.Value;
                    string[] slist = s.Split(',');
                    foreach (string id in slist)
                    {
                        //根据id删除
                    }
                }
               
            }
    一般情况下显示数据表gridview用的多一些,在gridview每行的第一个单元格添加一个checkbox,在button事件中
    protected void Button2_Click(object sender, EventArgs e)
          {
            sqlcon = new SqlConnection(strCon);
            SqlCommand sqlcom;
            for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
            {
                CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
                if (cbox.Checked == true)
              {

                    string sqlstr = "delete from 表 where 号码='" + GridView1.DataKeys[i].Value + "'";
                    sqlcom = new SqlCommand(sqlstr, sqlcon);
                    sqlcon.Open();
                    sqlcom.ExecuteNonQuery();
                    sqlcon.Close();
                }
            }
            bind();
        }
    bind函数用来绑定数据
    public void bind()
      {
            string sqlstr = "select top 5 * from 表";
            sqlcon = new SqlConnection(strCon);
            SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
            DataSet myds = new DataSet();
            sqlcon.Open();
            myda.Fill(myds, "tb_Member");
            GridView1.DataSource = myds;
            GridView1.DataKeyNames = new string[] ...{ "号码" };
            GridView1.DataBind();
            sqlcon.Close();
        }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • marist
    • 等级:
    发表于:2008-05-06 12:33:1918楼 得分:0
    似乎多数人都支持用字符串拼接,通过一条SQL语句删除哈。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 12:45:2619楼 得分:0
    上面无非两种做法,一个是循环删除,一个是循环取主键,拼接字符串。
    循环删除的人,根本就没有做过任何的效率测验,放大一下,到1w条,这样的做法会导致远程的i/o非常剧烈。。。
    拼接字符串是个效率不错的办法,前提是安全性和数据完整性要求不高的情况下。。

    另,如果只是做单表删除,可以启动数据库的事务,再循环体里面做删除,循环结束后一起提交。 效率也不会差。也可以支持参数化的删除,安全性也能得到提高。

    原因:启动事务之后,一直保持连接,所以对数据库的访问相当于建立一次连接,提交,关闭连接。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 12:48:1420楼 得分:0
    三楼正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:12:1521楼 得分:0
    引用 19 楼 caicai_45 的回复:
    上面无非两种做法,一个是循环删除,一个是循环取主键,拼接字符串。
    循环删除的人,根本就没有做过任何的效率测验,放大一下,到1w条,这样的做法会导致远程的i/o非常剧烈。。。
    拼接字符串是个效率不错的办法,前提是安全性和数据完整性要求不高的情况下。。

    另,如果只是做单表删除,可以启动数据库的事务,再循环体里面做删除,循环结束后一起提交。 效率也不会差。也可以支持参数化的删除,安全性也能得到提高。


    同意你后面的观点,启动事务是个好办法.
    循环删除如果用存储过程,删除1w条来说应该不会导致远程的i/o很剧烈吧.
    应该会比拼接字符串快很多.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:17:2322楼 得分:0
    先把选中的项找出来,用字符串拼接ID,再用一条SQL语句删除

    或用存储过程,找到一条删一条
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:34:0023楼 得分:0
    绑定时,绑的是DataTable,删除时,遍历修改DataTable,再利用原Adapter.Update(),同时更新数据源和数据库,哈哈哈
    瞎想的,可用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 13:35:2424楼 得分:0
    引用 17 楼 wzx516 的回复:
    string s = "";
    foreach (ListItem item in CheckBoxList1.Items)
    {
    if (item.Selected == true)
    {
    s = item.Value;
    string[] slist = s.Split(',');
    foreach (string id in slist)
    {
    //根据id删除
    }
    }

    }
    一般情况下显示数据表gridview用的多一些,在gridview每行的第一个单元格添加一个checkbox,在button事件中
    protected void Button2_Click(object sender, EventArgs e)
    {
    sqlcon = new SqlConnection(str…



    那不也一样用循环????

    期待有更好的办法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Pig23
    • 等级:
    发表于:2008-05-06 14:09:1225楼 得分:0
    2种方法:
    1:先遍历CheckBoxList,获取所有选中的id,作为一个数组传到存储过程里,存储过程循环该数组做删除,2次循环
    2:遍历CheckBoxList,每获取一个选中的做一次删除,1次循环
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 14:13:5126楼 得分:0
    字段拼接是个非常不错的选择。只需要将拼接的参数传入调用存储过程,启用事务一次执行,服务器负载也会很小。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 14:15:1127楼 得分:0
    引用 11 楼 badtank 的回复:
    delete from table where id in (id1,id2,id3...and so on)
    this is better way.


    这个方法美,我们这就这么做的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 14:37:3428楼 得分:0
    拼接是个好方法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 14:38:4729楼 得分:0
    拼接可能字符串太长了,1000个会员,如果id都是在1万以上的,那么就是5000+的长度了,如果是字符形式可能
    更长,像这样删除,其实做事务形式的参数化删除也是蛮快的,我这里试了一下按主键删除的话,基本上也是
    瞬间完成了。
    begin tran
    comm.commtext=...
    for(...)
    comm.para=value;
    comm.exec
    end tran
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 15:07:5830楼 得分:0
    那大家有没有试过一次插入10000条数据呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 16:38:2031楼 得分:0
    用循环吧。毕竟删数据是用的比较少的。多数是查询。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 17:39:2832楼 得分:0
    数据库连接管理.大部分数据库都支持长连接的.

    所以,连接根本不是问题... 一般大部分脚本都可以有效地管理连接及重用连接..

    所以,我觉得我的方法没有什么值得 haha 的...

    建议楼主及各位试试,就会知道,化整为零的好处所在了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 17:48:1033楼 得分:0
    首先 涉及到批量操作的话我就会想到用ado.net中sqldataadepter的update()方法,他可以实现批量操作
        具体思路:帮顶到CheckBoxList的数据应该是数据集合吧,这样的话,将选中的项对应的数据集中的记录delete()
                最后我得到的数据集是包含删除状态的记录,这样调用sqldataadepter的update()方法以后,
                  会与数据库只交互一次的情况将删除状态的记录全部删除
    其次 也可以遍历每个CheckBoxList,一旦被选中,将对应的一项删除,循环所有的CheckBoxList项

    自认为:批量删除应该用ado.net中sqldataadepter的update()来实现
    修改 删除 举报 引用 回复