본문 바로가기

WEB/ASP.NET

[ASP.NET 공부] ADO.NET 데이터베이스 프로그래밍 (CRUD) - 짱우의 코딩일기 - 티스토리

반응형

  '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" /> &nbsp;
    <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
        {

        }
    }
}

... 생략 ...

결과 화면

반응형