网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

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

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

网站中的批量删除很常见,特别是对在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.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中做批量选择删除,只要你有选中的都会删除。像上面前台
我们一般的做法是循环遍历一次调用一次过程,所以采用先循环遍历一次后,只调用一次就全部删除。

  • 上一篇资讯: 也谈ASP.NET中的身份验证
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师