热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> .Net编程>>正文内容

ASP.NET中批量删除--只调用一次存储过程

发布时间:2010年12月30日点击数: 佚名

网站中的批量删除很常见,特别是对在gridview中做批量删除。我们一般的做法是循环到勾选的就调用过程直接删除。如果是上百上千的数据要删除,那就得调用试行上百次。有人认为直接试行语句,何必那么麻烦但是我们可以对它处理的完善点,无论你选多少要删除的数据,只需调用试行一次。

底下写的存储过程删除语句与上图无关,上图是常见的在gridview中做批量删除。使用存储过程:

  1. --------------------------------------------------------------------------------------- 
  2. /* 
  3.  *作    者:lin sen 
  4.  *功能说明:动态构建SQL语句之删除 
  5.  *编写日期:2010年9月27日 
  6.  * 
  7. */ 
  8. --------------------------------------------------------------------------------------- 
  9. drop procedure proc_DeleteMessage 
  10. go 
  11. create procedure proc_DeleteMessage 
  12.     @condition        varchar(500)            --删除条件(多个)             
  13. as 
  14. begin 
  15.     declare @sql varchar(200) 
  16.     --动态构建删除语句 
  17.     select @sql='Delete from MessageInfo where '+@condition 
  18.     --试行语句 
  19.     exec (@sql) 
  20. end 
  21. go 

在SQL查询分析器上调用该过程:(传入的条件是唯一标识列名和所选中的值)

  1. exec proc_DeleteMessage 'MessageID=240 or MessageID=241 or MessageID=242...' 

在SQL调用看不太清楚,我们来看下Web中的前台调用与试行。

  1.  //删除按钮单击事件 
  2. protected void LBtn_Del_Click(object sender, EventArgs e) 
  3.     StringBuilder sb = new StringBuilder(); 
  4.     for (int i = 0; i < GV_class.Rows.Count; i++) 
  5.     { 
  6.         CheckBox checkbox = (CheckBox)GV_class.Rows[i].FindControl("checkbox"); 
  7.         if (checkbox.Checked == false
  8.         { 
  9.             lab_Note.Text = "请选择要删除信息"
  10.             lab_Note.Style.Add("color""red"); 
  11.         } 
  12.         else 
  13.         { 
  14.             MessageModel.C_ID = Int32.Parse(GV_class.Rows[i].Cells[3].Text.Trim());//选中的唯一标识列值 
  15.             sb.Append("MessageID="); 
  16.             sb.Append(MessageModel.C_ID); 
  17.             sb.Append(" or "); 
  18.         } 
  19.     } 
  20.     sb.Append("MessageID=null"); 
  21.     MessageModel.SQLSTR = sb.ToString();//动态的条件语句传给实体 
  22.     int j = DeleteClass(MessageModel); 
  23.     //..... 
  24. /// <summary> 
  25. /// 删除信息 
  26. /// </summary> 
  27. /// <param name="MeModel"></param> 
  28. /// <returns></returns> 
  29. public int DeleteClass(MessageModel MeModel) 
  30.     int rowsAffected; 
  31.     SqlParameter[] parameter = { new SqlParameter("@sqlstr", SqlDbType.Int) }; 
  32.     parameter[0].Value = MeModel.SQLSTR; 
  33.     DbHelperSQL.RunIntProcName("proc_DeleteMessage"out rowsAffected, parameter); 
  34.     return rowsAffected; 

后续完善:(避免大家犯同样错误)
由于个人考虑和分析的不周,此方法存在很多问题,感谢几位的评论和建议;使本人受益匪浅!底下是存在的问题:

1、有人提出用in比or效率更好?
2、用存储过程后避免在程序上拼接SQL语句,或者直接在程序上拼接。
3、跟普通的删除没咋区别,是否只删除一页?
 本人还是用存储过程拼接解法吧,以下是修改后的:

  1. --------------------------------------------------------------------------------------- 
  2. /*  
  3.  *作    者:lin sen  
  4.  *功能说明:动态构建SQL语句之删除  
  5.  *编写日期:2010年9月27日  
  6.  * 
  7. */--------------------------------------------------------------------------------------- 
  8. drop procedure proc_DeleteMessage 
  9. go 
  10. create procedure proc_DeleteMessage 
  11. (     
  12.     @tablename        varchar(100),        --表名 
  13.     @colname          varchar(100),        --列名 
  14.     @condition        varchar(500)      --列值             
  15. as 
  16. begin   
  17.     declare @sql     varchar(500)      
  18.     select @sql='delete from '+@tablename+' where '+@colname+' in('+@condition+')' 
  19.     print @sql 
  20.     exec(@sql)     
  21. end 
  22. go 

这边的话调用的时候还要处理,就是你传入的列值如果是字符串的,那么应该是in('','',''....),整形的是:in(, , ,....).
这样的话就解决1,2问题。对于3,这个做法是对在GridView中做批量选择删除,只要你有选中的都会删除。像上面前台
我们一般的做法是循环遍历一次调用一次过程,所以采用先循环遍历一次后,只调用一次就全部删除。

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作