ASP.NET中批量刪除--只調用一次存儲過程

作者: 無帆之舟  來源: 博客園  發布時間: 2011-01-03 22:08  閱讀: 1816 次  推薦: 0   原文鏈接   [收藏]  
摘要:今天我們將談到的是ASP.NET運用動態構建語句實現高效批量刪除,無論你選多少要刪除的數據,只需調用試行一次。

  網站中的批量刪除很常見,特別是對在gridview中做批量刪除。我們一般的做法是循環到勾選的就調用過程直接刪除。如果是上百上千的數據要刪除,那就得調用試行上百次。有人認為直接試行語句,何必那么麻煩但是我們可以對它處理的完善點,無論你選多少要刪除的數據,只需調用試行一次。

  底下寫的存儲過程刪除語句與上圖無關,上圖是常見的在gridview中做批量刪除。使用存儲過程:

代碼
 
---------------------------------------------------------------------------------------
/*
*作 者:lin sen
*功能說明:動態構建SQL語句之刪除
*編寫日期:2010年9月27日
*

*/
---------------------------------------------------------------------------------------
drop procedure proc_DeleteMessage
go
create procedure proc_DeleteMessage
(

@condition varchar(500) --刪除條件(多個)
)
as
begin
declare @sql varchar(200)
--動態構建刪除語句
select @sql='Delete from MessageInfo where '+@condition
--試行語句
exec (@sql)
end
go

  在SQL查詢分析器上調用該過程:(傳入的條件是唯一標識列名和所選中的值)

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

  在SQL調用看不太清楚,我們來看下Web中的前臺調用與試行。

代碼
 
//刪除按鈕單擊事件
protected void LBtn_Del_Click(object sender, EventArgs e)
{
StringBuilder sb
= new StringBuilder();
for (int i = 0; i < GV_class.Rows.Count; i++)
{
CheckBox checkbox
= (CheckBox)GV_class.Rows[i].FindControl("checkbox");
if (checkbox.Checked == false)
{
lab_Note.Text
= "請選擇要刪除信息";
lab_Note.Style.Add(
"color", "red");
}

else
{
MessageModel.C_ID
= Int32.Parse(GV_class.Rows[i].Cells[3].Text.Trim());//選中的唯一標識列值
sb.Append("MessageID=");
sb.Append(MessageModel.C_ID);
sb.Append(
" or ");
}
}
sb.Append(
"MessageID=null");
MessageModel.SQLSTR
= sb.ToString();//動態的條件語句傳給實體
int j = DeleteClass(MessageModel);
//.....
}
/// <summary>
/// 刪除信息
/// </summary>
/// <param name="MeModel"></param>
/// <returns></returns>
public int DeleteClass(MessageModel MeModel)
{

int rowsAffected;
SqlParameter[] parameter
= { new SqlParameter("@sqlstr", SqlDbType.Int) };
parameter[
0].Value = MeModel.SQLSTR;
DbHelperSQL.RunIntProcName(
"proc_DeleteMessage", out rowsAffected, parameter);
return rowsAffected;
}

  后續完善:(避免大家犯同樣錯誤)

  由于個人考慮和分析的不周,此方法存在很多問題,感謝幾位的評論和建議;使本人受益匪淺!底下是存在的問題:

  1、有人提出用in比or效率更好?

  2、用存儲過程后避免在程序上拼接SQL語句,或者直接在程序上拼接。

  3、跟普通的刪除沒咋區別,是否只刪除一頁?

  本人還是用存儲過程拼接解法吧,以下是修改后的:

代碼
 
---------------------------------------------------------------------------------------
/*
*作 者:lin sen
*功能說明:動態構建SQL語句之刪除
*編寫日期:2010年9月27日
*

*/---------------------------------------------------------------------------------------
drop procedure proc_DeleteMessage
go
create procedure proc_DeleteMessage
(

@tablename varchar(100), --表名
@colname varchar(100), --列名
@condition varchar(500) --列值
)
as
begin
declare @sql varchar(500)
select @sql='delete from '+@tablename+' where '+@colname+' in('+@condition+')'
print @sql
exec(@sql)
end
go

  這邊的話調用的時候還要處理,就是你傳入的列值如果是字符串的,那么應該是in('','',''....),整形的是:in(, , ,....).

  這樣的話就解決1,2問題。對于3,這個做法是對在GridView中做批量選擇刪除,只要你有選中的都會刪除。像上面前臺

  我們一般的做法是循環遍歷一次調用一次過程,所以采用先循環遍歷一次后,只調用一次就全部刪除。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()