본문 바로가기

WEB/ASP.NET

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

반응형

  'ASP.NET & Core를 다루는 기술'이라는 책을 통해서 ASP.NET 공부를 하기 시작했다. 아직 많이 읽어보질 못해 평가하기는 좀 그렇지만 예제랑 설명이 적절하게 섞여서 나온 책인 것 같다. 위의 책을 바탕으로 공부한 내용을 글로 쓰려한다.


ADO.NET 데이터베이스 프로그래밍

데이터베이스 연결 문자열의 필수 구성 요소 네 가지

  데이터베이스 연결 문자열의 필수 구성 요소 네 가지는 다음과 같다.

  • Server ( Data Source ) : 데이터베이스 서버의 위치를 나타낸다. IP 주소 또는 도메인 정보를 입력한다.
  • Database ( DB, Initial Catalog ) : 데이터베이스의 이름을 지정한다.
  • User ID ( UID ) : 데이터베이스에 대한 권한에 있는 사용자 아이디를 입력한다.
  • Password ( PWD ) : 데이터베이스에 대한 권한이 있는 사용자 비밀번호를 입력한다.

System.Data.SqlClient를 위한 데이터베이스 연결 문자열 샘플

  SQL Server에 접근할 수 있는 데이터베이스 연결 문자열은 다음과 같은 스타일로 지정한다.

  • Server=localhost; Initial Catalog=master; Integrated Security=true;
  • Server=localhost; Database=master; User ID=UserID; Password=xyz;

  서버를 지정할 때는 다음과 같이 프로토콜, 서버명(IP 주소), 인스턴스명 포트번호 등을 설정할 수 있다.

  • Server=tcp:ServerName\InstanceName,1433

닷넷에서 데이터베이스 처리 관련 주요 클래스

  • Connection 클래스 : 데이터베이스 연결 및 종료
  • Command 클래스 : 데이터베이스에 명령 실행
  • DataReader 클래스 : Select 구문의 실행 결과값 받기
  • DataSet 클래스 : 메모리 상의 데이터베이스로 Select와 같은 결과값 저장
  • DataAdapter 클래스 : 명령어 전달 및 실행 후 값을 DataSet 클래스에게 전달
  • DataTable 클래스 : DataSet 안에 들어 있는 메모리 상의 테이블
  • DataView 클래스 : DataSet 안에 들어 있는 메모리 상의 뷰

실습 ( DB 프로그래밍 학습을 위한 프로젝트 및 데이터베이스 구성 )

  책에서는 Visual Studio내에 있는 SQL Server 개체 탐색기를 이용해서 데이터베이스를 구성했지만 나는 직접 SSMS에서 데이터베이스를 구성했다.

  데이터베이스는 위와 같이 'DevADONET'으로 생성을 했다.

  테이블은 위와 같이 만들었다. 'Num' 같은 경우에는 Primary Key로 설정을 했고 Identity값을 주어서 1씩 증가하도록 만들었다. 그리고 'PostDate' 같은 경우에는 Default 값을 GetDate()로 주었다.

Web.config

<configuration>
	<!-- 데이터베이스 연결 문자열 지정 -->
  <connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=10.188.2.239;Initial Catalog=DevADONET;User ID=chang;Password=root1234!!" providerName="System.Data.SqlClient"/>  
  </connectionStrings>
</configuration>

  이후에 'Web.config'에 연결 문자열 정보를 기록해주었다.

실습 ( SqlConnection 클래스를 사용해 SQL Server 연결하기 )

  실습을 위해 'FrmSqlConnection.aspx' 웹 폼을 하나 만들어 준다. 그리고 aspx, cs 코드는 다음과 같이 입력한다.

... 생략 ...

<div>
    <asp:Button ID="btnSqlConnection" runat="server" Text="SQL Server에 연결하기" OnClick="btnSqlConnection_Click" />
    <hr />
    <asp:Label ID="lblDisplay" runat="server"></asp:Label>
</div>

... 생략 ...
... 생략 ...

protected void btnSqlConnection_Click(object sender, EventArgs e)
{
    // [1] SqlConnection 클래스의 인스턴스 생성
    SqlConnection con = new SqlConnection();

    // [2] ConnectionString 속성 지정
    // Web.config에 설정된 값 가져와서 지정
    con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

    // [3] Open() 메서드 실행 : 데이터베이스 연결
    con.Open();

    // [!] 실행
    lblDisplay.Text = "데이터베이스 연결 성공";

    // [4] Close() 메서드 실행 : 데이터베이스 연결 종료
    con.Close();
}

... 생략 ...

  해당 버튼을 눌렀을 때 데이터베이스 연결이 성공했다는 메세지가 뜨는 것을 확인할 수 있다.

protected void btnSqlConnection_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        try
        {
            con.Open();
        }
        catch
        {
            lblDisplay.Text = "데이터베이스 연결 실패";
        }
        finally
        {
            lblDisplay.Text = "데이터베이스 연결 성공";
        }
    }
}

  위와 같이 using문과 try~catch 문을 이용해주면 자동으로 con.Close() 메서드도 실행되고 에러 방지도 된다.

실습 ( SqlCommand 클래스를 사용해 데이터베이스 명령어 실행하기 )

  실습을 위해 'FrmSqlCommand.aspx' 웹 폼을 생성하고 aspx, cs 코드는 다음과 같이 입력한다.

... 생략 ...

<div>
    <asp:Button ID="btnSqlCommand" runat="server" Text="입력 예시문 실행" OnClick="btnSqlCommand_Click" />
    <hr />
    <asp:Label ID="lblDisplay" runat="server"></asp:Label>
</div>

... 생략 ...
... 생략 ...

protected void btnSqlCommand_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

        try
        {
            con.Open();

            // [1] SqlCommand의 인스턴스 생성
            SqlCommand cmd = new SqlCommand();

            // [2] Connection 속성 지정
            cmd.Connection = con;

            // [3] CommandText 속성 설정
            cmd.CommandText = @"INSERT INTO Memos VALUES (N'홍길동', N'h@h.com', N'홍길동입니다.', GetDate(), '127.0.0.1')";

            // [4] CommandType 속성 지정
            cmd.CommandType = System.Data.CommandType.Text;

            // [5] ExecuteXXX() 메서드로 실행
            cmd.ExecuteNonQuery();
        }
        catch
        {
            lblDisplay.Text = "데이터 저장 실패";
        }
        finally
        {
            lblDisplay.Text = "데이터 저장 성공";
        }
    }
}

... 생략 ...

< 성공했다는 출력 화면 >

  '입력 예시문 실행' 버튼을 누르면 해당 쿼리문(Insert문)이 실행되는 실습을 해보았다. 데이터 저장 성공이라는 로그도 잘 떴고 테이블을 확인해 본 결과 데이터 값들도 잘 들어온 것을 확인할 수 있다.

실습 ( SqlDataReader 클래스로 데이터를 받아 출력하기 )

  ASP.NET에서 커맨드 개체를 사용해 SQL Server에 Select 문을 실행한 결과를 받아 올 때 SqlDataReader 클래스를 사용한다.

  실습을 위해 'FrmSqlDataReader.aspx' 웹 폼을 생성하고 aspx, cs 코드는 다음과 같이 입력한다.

... 생략 ...

<div>
    <asp:Literal ID="tblOutput" runat="server"></asp:Literal>
</div>

... 생략 ...
... 생략 ...

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        DisplayData();
}

private void DisplayData()
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        string strOutput = String.Empty;


        try
        {
            con.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = @"SELECT * FROM Memos ORDER BY Num DESC";
            cmd.CommandType = System.Data.CommandType.Text;

            // [1] SqlDatareader 형식의 개체로 결과값 받기
            SqlDataReader dr = cmd.ExecuteReader();

            // [2] Read() 메서드로 데이터 있는만큼 반복
            strOutput = "<table border=\"1\">" +
                "<tr><td>번호</td><td>이름</td><td>메모</td><td>작성일</td></tr>";
            while (dr.Read())
            {
                strOutput += $"<tr><td>{dr["Num"]}</td>" +
                    $"<td>{dr[1]}</td>" + 
                    $"<td>{dr.GetString(3)}</td>" + $"<td>{dr.GetDateTime(4).ToShortDateString()}</td></tr>";

            }
            strOutput += "</table>";
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            // [!] 출력
            tblOutput.Text = strOutput;
        }
    }
}

... 생략 ...

  DataReader 클래스를 통해 테이블에 저장되어있는 값들을 웹 페이지에 뿌려주는 실습이었다.

SqlDataAdapter 클래스와 DataSet 클래스

DataSet 클래스 개요

  DataSet 클래스는 '메모리의 데이터베이스'라고 정의할 수 있다. 즉, 메모리에 필드와 레코드로 이루어진 테이블을 여러 개 올려 놓는다. 그리고 해당 테이블 간의 관계를 설정하고, 각각의 테이블에서 데이터를 입력, 출력, 수정, 삭제, 검색하는 일반적인 데이터베이스 처리 로직을 구현한다.

SqlDataAdapter 클래스

  DataSet 크래스가 Select 문의 실행 결과를 담아 놓는 그릇 역할을 한다면 SqlDataAdapter 클래스는Select 문을 실행시키고 실행된 결과값을 가져다가 DataSet 개체에게 채워주는 중간 매개체 역할을 한다.

실습 ( SqlDataAdapter와 DataSet 클래스로 데이터 출력하기 )

  실습을 위해 'FrmSqlDataAdapter.aspx' 웹 폼을 생성하고 aspx, cs 코드는 다음과 같이 입력한다.

... 생략 ...

<div>
    <asp:GridView ID="ctlMemoLists" runat="server"></asp:GridView>
</div>

... 생략 ...
... 생략 ...

protected void Page_Load(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

        try
        {
            con.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = @"SELECT * FROM Memos ORDER BY Num DESC";
            cmd.CommandType = System.Data.CommandType.Text;

            // [1] DataAdapter
            SqlDataAdapter da = new SqlDataAdapter();

            // [2] SelectCommand 지정
            da.SelectCommand = cmd;

            // [3] DataSet : 메모리상의 데이터베이스
            DataSet ds = new DataSet();


            // [4] Fill() 메서드로 DataSet 채우기
            da.Fill(ds, "Memos");

            // [!] 출력
            ctlMemoLists.DataSource = ds.Tables[0].DefaultView; // ds만 지정가능
            ctlMemoLists.DataBind();
        }
        catch (Exception error)
        {

        }
    }
}

... 생략 ...

반응형