ASP.NET中批量刪除--只調用一次存儲過程
摘要:今天我們將談到的是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
/*
*作 者: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;
}
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
/*
*作 者: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中做批量選擇刪除,只要你有選中的都會刪除。像上面前臺
我們一般的做法是循環遍歷一次調用一次過程,所以采用先循環遍歷一次后,只調用一次就全部刪除。
全站熱搜