반응형
'ASP.NET & Core를 다루는 기술'이라는 책을 통해서 ASP.NET 공부를 하기 시작했다. 아직 많이 읽어보질 못해 평가하기는 좀 그렇지만 예제랑 설명이 적절하게 섞여서 나온 책인 것 같다. 위의 책을 바탕으로 공부한 내용을 글로 쓰려한다.
CRUD 작업
실습 ( Memos 테이블에 데이터 입력하기 )
이번 실습에서는 지금까지 해왔던 실습과는 다르게 sp(Stroed Procedure)를 사용할거기 때문에 프로시저문 부터 작성한다.
CREATE PROCEDURE WriteMemo
(
@Name NVARCHAR(25),
@Email NVARCHAR(100),
@Title NVARCHAR(150),
@PostIP NVARCHAR(15)
)
AS
INSERT Memos(Name, Email, Title, PostIP) VALUES (@Name, @Email, @Title, @PostIP)
위의 프로시저문은 4개의 매개변수에 값을 받아서 그 값을 통해 테이블에 입력하는 코드다.
'FrmMemoWrite.aspx' 웹 폼을 하나 만들고 '/Models/Memo.cs' 클래스를 하나 만들어 준다.
Memo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ASP_Practice.Day0128.TestDB.Models
{
/// <summary>
/// Memos 테이블과 일대일 매핑되는 Memo 클래스
/// </summary>
public class Memo
{
public int Num { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Title { get; set; }
public DateTime PostDate { get; set; }
public string PostIp { get; set; }
}
}
FrmMemoWrite.aspx
<div>
<h3>데이터 입력</h3>
이름 : <asp:TextBox ID="txtName" runat="server"></asp:TextBox> <br />
이메일 : <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> <br />
메모 : <asp:TextBox ID="txtTitle" runat="server"></asp:TextBox> <br />
<asp:Button ID="btnWrite" runat="server" Text="저장" OnClick="btnWrite_Click" />
<asp:Button ID="btnList" runat="server" Text="리스트" OnClick="btnList_Click" />
<hr />
<asp:Label ID="lblDisplay" runat="server"></asp:Label>
</div>
FrmMemoWrite.aspx.cs
... 생략 ...
protected void btnWrite_Click(object sender, EventArgs e)
{
// [0] 변수 선언부
Memo memo = new Memo();
memo.Name = txtName.Text;
memo.Email = txtEmail.Text;
memo.Title = txtTitle.Text;
memo.PostDate = DateTime.Now;
memo.PostIp = Request.UserHostAddress;
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("WriteMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [!] 파라미터 추가
cmd.Parameters.AddWithValue("@Name", memo.Name);
cmd.Parameters.AddWithValue("@Email", memo.Email);
cmd.Parameters.AddWithValue("@Title", memo.Title);
cmd.Parameters.AddWithValue("@PostIP", memo.PostIp);
// [!] 실행
cmd.ExecuteNonQuery();
}
catch
{
}
finally
{
lblDisplay.Text = "저장되었습니다.";
}
}
}
protected void btnList_Click(object sender, EventArgs e)
{
Response.Redirect("FrmMemoList.aspx");
}
... 생략 ...
결과 화면
실습 ( Memos 테이블의 모든 데이터 출력하기 )
실습을 위해 프로시저와 'FrmMemoList.aspx' 웹 폼 하나를 생성한다. 코드는 다음과 같이 입력한다.
프로시저
CREATE PROCEDURE ListMemo
AS
SELECT *
FROM Memos
ORDER BY Num DESC
FrmMemoList.aspx
... 생략 ...
<div>
<h3>메모 리스트</h3>
<asp:GridView ID="ctlMemoList" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="번호" DataField="Num" />
<asp:BoundField HeaderText="작성자" DataField="Name" />
<asp:HyperLinkField HeaderText="메모" DataTextField="Title" DataNavigateUrlFormatString="FrmMemoView.aspx?Num={0}" DataNavigateUrlFields="Num" />
<asp:TemplateField HeaderText="작성일">
<ItemTemplate>
<%# Eval("PostDate") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<hr />
<asp:HyperLink ID="lnkMemoWrite" runat="server" NavigateUrl="~/Day0128/TestDB/FrmMemoWrite.aspx">글쓰기</asp:HyperLink>
</div>
... 생략 ...
FrmMemoList.aspx.cs
... 생략 ...
public partial class FrmMemoList : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("ListMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [3] 데이터어댑터
SqlDataAdapter da = new SqlDataAdapter(cmd);
// [4] 데이터셋
DataSet ds = new DataSet();
da.Fill(ds, "Memos");
// [5] 출력
ctlMemoList.DataSource = ds;
ctlMemoList.DataBind();
}
catch
{
}
}
}
}
결과 화면
실습 ( Memos 테이블에서 단일 데이터 출력하기 )
실습을 위해 프로시저와 'FrmMemoView.aspx' 웹 폼 하나를 생성한다. 코드는 다음과 같이 입력한다.
프로시저
CREATE PROCEDURE ViewMemo
@Num INT
AS
SELECT *
FROM Memos
WHERE Num = @Num
FrmMemoView.aspx
... 생략 ...
<div>
<h3>상세보기</h3>
번호 : <asp:Label ID="lblNum" runat="server"></asp:Label> <br />
이름 : <asp:Label ID="lblName" runat="server"></asp:Label> <br />
이메일 : <asp:Label ID="lblEmail" runat="server"></asp:Label> <br />
메모 : <asp:Label ID="lblTitle" runat="server"></asp:Label> <br />
작성일 : <asp:Label ID="lblPostDate" runat="server"></asp:Label> <br />
IP 주소 : <asp:Label ID="lblPostIP" runat="server"></asp:Label> <br />
<hr />
<asp:HyperLink ID="lnkMemoModify" runat="server">수정</asp:HyperLink>
<asp:HyperLink ID="lnkMemoDelete" runat="server">삭제</asp:HyperLink>
<asp:HyperLink ID="lnkMemoList" runat="server" NavigateUrl="FrmMemoList.aspx">리스트</asp:HyperLink>
</div>
... 생략 ...
FrmMemoView.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
// 넘어온 쿼리스트링 값이 없다면
if (String.IsNullOrEmpty(Request["Num"]))
{
Response.Write("잘못된 요청입니다.");
Response.End();
}
else
{
DisplayData();
lnkMemoModify.NavigateUrl = $"FrmMemoModify.aspx?Num={Request["Num"]}";
lnkMemoDelete.NavigateUrl = $"FrmMemoDelete.aspx?Num={Request["Num"]}";
}
}
private void DisplayData()
{
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("ViewMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [!] 파라미터 추가
cmd.Parameters.Add("Num", System.Data.SqlDbType.Int); // 정수형
cmd.Parameters["Num"].Value = Convert.ToInt32(Request["Num"]);
// [3] 데이터리더
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
// [!] 각각의 컨트롤에 바인딩
lblNum.Text = Request["Num"];
lblName.Text = dr["Name"].ToString();
lblEmail.Text = dr[2].ToString();
lblTitle.Text = dr.GetString(3);
lblPostDate.Text = dr.GetDateTime(4).ToString();
lblPostIP.Text = dr.GetString(5);
}
else
{
Response.Write("없는 데이터입니다.");
Response.End();
}
dr.Close();
}
catch
{
}
}
}
결과 화면
실습 ( Memos 테이블의 데이터 수정하기 )
실습을 위해 프로시저와 'FrmMemoModify.aspx' 웹 폼 하나를 생성한다. 코드는 다음과 같이 입력한다.
프로시저
CREATE PROCEDURE ModifyMemo
@Name NVARCHAR(25),
@Email NVARCHAR(100),
@Title NVARCHAR(150),
@Num INT
AS
BEGIN TRAN
UPDATE Memos SET Name = @Name, Email = @Email, Title = @Title WHERE Num = @Num
COMMIT TRAN
UPDATE문이기 때문에 트랜잭션을 이용한 프로시저를 만들어주었다.
FrmMemoModify.aspx
... 생략 ...
<div>
<h3>데이터 수정</h3>
번호 : <asp:Label ID="lblNum" runat="server"></asp:Label> <br />
이름 : <asp:TextBox ID="txtName" runat="server"></asp:TextBox> <br />
이메일 : <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> <br />
메모 : <asp:TextBox ID="txtTitle" runat="server"></asp:TextBox> <br />
<asp:Button ID="btnModify" runat="server" Text="수정" OnClick="btnModify_Click" />
<asp:Button ID="btnList" runat="server" Text="리스트" OnClick="btnList_Click" />
</div>
... 생략 ...
FrmMemoModify.aspx.cs
public partial class FrmMemoModify : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 넘어온 쿼리스트링 값이 없다면
if (String.IsNullOrEmpty(Request["Num"]))
{
Response.Write("잘못된 요청입니다.");
Response.End();
}
else
{
// 처음 로드 시만 읽어 오고, 수정 버튼 클릭 시에는 해당 기능만 구현
if (!Page.IsPostBack)
DisplayData();
}
}
private void DisplayData()
{
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("ViewMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [!] 파라미터 추가
cmd.Parameters.Add("Num", System.Data.SqlDbType.Int); // 정수형
cmd.Parameters["Num"].Value = Convert.ToInt32(Request["Num"]);
// [3] 데이터리더
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
// [!] 각각의 컨트롤에 바인딩
lblNum.Text = Request["Num"];
txtName.Text = dr["Name"].ToString();
txtEmail.Text = dr[2].ToString();
txtTitle.Text = dr.GetString(3);
}
else
{
Response.Write("없는 데이터입니다.");
Response.End();
}
dr.Close();
}
catch
{
}
}
}
protected void btnModify_Click(object sender, EventArgs e)
{
// [0] 변수 선언부
Memo memo = new Memo();
memo.Num = Convert.ToInt32(Request["Num"]);
memo.Name = txtName.Text;
memo.Email = txtEmail.Text;
memo.Title = txtTitle.Text;
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("ModifyMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [!] 파라미터 추가
cmd.Parameters.AddWithValue("@Name", memo.Name);
cmd.Parameters.AddWithValue("@Email", memo.Email);
cmd.Parameters.AddWithValue("@Title", memo.Title);
cmd.Parameters.AddWithValue("@Num", memo.Num);
// [!] 실행
cmd.ExecuteNonQuery();
}
catch
{
}
finally
{
// [3] 마무리
Response.Redirect("FrmMemoView.aspx?Num=" + Request["Num"]);
}
}
}
protected void btnList_Click(object sender, EventArgs e)
{
// 리스트 페이지로 이동
Response.RedirectPermanent("FrmMemoList.aspx");
}
}
- 웹 페이지가 로드될 때 Num을 이용해서 해당 Num에 대한 데이터값을 가져온 후에 컨트롤에 각각 값을 넣어준다.
- 수정 버튼을 누르게 되면 해당 컨트롤 값들을 프로시저 매개변수에 넣어 UPDATE문을 실행시킨다.
결과 화면
실습 ( Memos 테이블에서 데이터 삭제하기 )
이 실습 역히 프로시저 (DELETE문 실행하는 프로시저)를 이용한 실습이기 때문에 생략하도록 한다.
실습 ( Memos 테이블에서 데이터 검색하기 )
실습을 위해 프로시저와 'FrmMemoSearch.aspx' 웹 폼 하나를 생성한다. 코드는 다음과 같이 입력한다.
프로시저
CREATE PROCEDURE SearchMemo
@SearchField NVARCHAR(10),
@SearchQuery NVARCHAR(50)
AS
DECLARE @strSql NVARCHAR(150) -- 변수 선언
SET @strSql =
'
SELECT *
FROM Memos
WHERE ' + @SearchField + ' LIKE
N''%' + @SearchQuery + '%''
ORDER BY NUM DESC'
EXEC (@strSql) -- 완성된 SQL문 실행
FrmMemoSearch.aspx
... 생략 ...
<div>
<h3>데이터 검색</h3>
<asp:DropDownList ID="lstSearchField" runat="server">
<asp:ListItem Value="Name" Selected="True">이름</asp:ListItem>
<asp:ListItem Value="Title">메모</asp:ListItem>
</asp:DropDownList>
<asp:TextBox ID="txtSearchQuery" runat="server"></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" Text="검색" OnClick="btnSearch_Click" />
<hr />
<asp:GridView ID="ctlMemoSearchList" runat="server"></asp:GridView>
</div>
... 생략 ...
FrmMemoSearch.aspx.cs
... 생략 ...
protected void btnSearch_Click(object sender, EventArgs e)
{
// [1] 커넥션
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
con.Open();
// [2] 커맨드
SqlCommand cmd = new SqlCommand("SearchMemo", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// [!] 파라미터 추가
cmd.Parameters.AddWithValue("SearchField", lstSearchField.SelectedValue);
cmd.Parameters.AddWithValue("SearchQuery", txtSearchQuery.Text);
// [3] 데이터어댑터
SqlDataAdapter da = new SqlDataAdapter(cmd);
// [4] 데이터셋
DataSet ds = new DataSet();
da.Fill(ds, "Memos");
// [5] 출력
ctlMemoSearchList.DataSource = ds.Tables[0].DefaultView;
ctlMemoSearchList.DataBind();
}
catch
{
}
}
}
... 생략 ...
결과 화면
반응형