ASP.NET MVC 웹 화면의 그리드에서 체크박스로 나열된 여러 Row를 선택하고 한 번에 삭제하는 방법을 데이터베이스(SQL Server, Table-Valued Parameters) 부분부터 C# 코드의 부분까지 간단하지만, 실무에서 유용한 과정을 정리하였다. Micro-ORM으로 Dapper를 사용하였다.
Database
--테이블 타입 생성
CREATE TYPE dbo.IDList AS TABLE (
ID varchar(11) COLLATE Korean_Wansung_CI_AS NULL
)
--스토어드 프로시저 생성 : 테이블명은 SomeTable로 가정
CREATE PROCEDURE [dbo].[SP_DeleteList]
@IDList IDList READONLY
AS
BEGIN
DELETE FROM SomeTable
WHERE ID IN (SELECT ID FROM @IDList)
END
Model, Dapper Operation
// DapperORM class
public void ExecuteWithoutReturn(string procedureName, DynamicParameters param)
{
using (_connection) {
_connection.Execute(procedureName, param, commandType: CommandType.StoredProcedure);
}
}
public SqlMapper.ICustomQueryParameter ReturnTableParameter(string[] rows)
{
using (var dt = new DataTable()) {
dt.Columns.Add("ID");
if (rows != null)
foreach (var s in rows) { dt.Rows.Add(s); }
return dt.AsTableValuedParameter();
}
}
// Repository class
private readonly DapperORM _dapperOrm = new DapperORM();
public void DeleteList(string[] rows, string userID)
{
var param = new DynamicParameters();
param.AddDynamicParams(new {IDList = _dapperOrm.ReturnTableParameter(rows), userID});
_dapperOrm.ExecuteWithoutReturn("SP_DeleteList");
}
Controller, View
// Controller
Repository _repository = new Repository();
[HttpPost]
public ActionResult Delete(string[] rows, userID)
{
_repository.DeleteList(rows, userID);
return RedirectToAction("Index");
}
<!-- View(chtml) -->
@foreach (var item in Model)
{
<tr><td><input type="checkbox" name="rows" value="@item.ID" /></td>
<td>...</td></tr>
}
<button type="submit" formaction="Delete" formmethod="post">삭제</button>