[ASP.NET] 직접 데이터 접근(1)

데이터베이스와 상호작용하는 가장 쉬운 방법은 직접 데이터에 접근하는 것이다. 직접 데이터 접근 방식에서 데이터에 대한 질의는 데이터베이스로의 연결이 열리고 닫히는 사이에 이루어지기 때문에 연결 기반 데이터 접근이라고도 한다.

직접 데이터 접근 방식을 통한 데이터 검색 과정

 

Connection 객체 생성

일반적으로 데이터 소스에 접근할 수 있는 연결 개수에는 제한이 있으며, 개수를 넘어 요청되는 연결은 열리지 않는다. 따라서 연결이 열려 있는 시간을 짧게 하려는 노력이 필요하다.

 

Connection 객체를 생성하고 연결을 열기 위해서는 ConnectionString 속성을 적절하게 설정해야 한다.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = @"Data Source=localhost;" +
  "Initial Catalog = AdventueWorksLT2008; Integrated Security=SSPI";

생성자를 이용하여 다음과 같이 설정하는 것도 가능하다.

string connectionString = @"Data Source=localhost;" +
  "Initial Catalog = AdventureWorksLT2008; Integrated Security=SSPi";
SqlConnection conn = new SqlConnection(connectionString);

연결 문자열

데이터베이스 연결에 필요한 정보들을 세미콜론으로 구분하여 연결해놓은 문자열이다.

· Data Source : 데이터 소스가 위치한 곳을 나타낸다.

· Initial Catalog : 연결을 통해 처음 사용하고자 하는 데이터베이스 이름을 설정한다. 처음이라는 단어를 사용한 이유는 ChangeDatabase() 메서드를 통해 사용하고자 하는 데이터베이스를 변경할 수 있기 때문이다.

· Integrated Security : false 값으로 설정하면 SQL 서버의 사용자 계정을 사용하여 데이터베이스에 연결되고, true 값으로 설정하면 웹 서버가 운영되고 있는 Windows 사용자 계정을 이용하여 SQL 서버에 연결된다. Windows 사용자 계정을 이용할 경우 true 값보다 통합 보안 서비스가 잘 정의된 API를 제공받기 위해 SSPI로 설정할 것을 적극 권장한다.

 

SQL 서버의 사용자 계정을 사용하고자 할 경우 id와 password 값을 설정해야 한다.

conn.ConnectionString = @"Data Source=localhost;" +
  "Initial Catalog = AdventueWorksLT2008;" +
  "User ID=sa; Password=1234";

· Provider : 데이터 공급자를 명시하기 위해 사용한다. 다음은 Excel 파일에 연결하기 위한 연결 문자열의 예이다.

conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.9;" +
  "Data Source=D:\Applicant.xlsx;" +
  "Extended Properties=Excel 12.0";

 

연결 문자열의 저장

연결 문자열을 클래스 멤버 변수 또는 구성 파일에 저장하는 방법을 사용하는 것이 일반적이다. 웹 응용 프로그램에서 사용하는 데이터 소스가 변경되었을 경우에는 좀 더 유연하게 대처하기 ㅜ이해 연결 문자열을 구성 파일에 저장하는 것이 좋다.

 

ASP.NET MMC를 이용하여 연결 문자열을 구성하는 방법은 다음과 같다.

1. [시작] 버튼을 클릭한 후, 검색 창에 'INetMgr'을 입력한다.

2. ASP.ENT MMC의 연결 창에서 [Default Web Site]를 선택하고 ASP.NET 영역에서 <연결 문자열>을 더블 클릭한다.

3. [연결 문자열] 페이지의 우측 작업 창에서 [추가] 링크 버튼을 클릭한다.

4. [연결 문자열 추가] 창에서 각 항목을 다음과 같이 설정하고 [확인] 버튼을 클릭한다.

· 이름 : AdventureWorks    · SQL Server 선택

· 서버 : .\SQLEXPRESS              · 데이터베이스 : AdventureWorks2019

· 자격 증명 : Windows 통합 보안 사용

추가된 연결 문자열은 "C:\inetpub\wwwroot" 폴더에 있는 'web.config' 파일의 <connectionString> 섹션에 저장된다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <sessionState cookieless="UseCookies" mode="InProc" timeout="10" />
    </system.web>
    <connectionStrings>
        <add connectionString="Server=localhost;Database=AdventureWorksLT2008;Integrated Security=true" name="AdventureWorks" />
    </connectionStrings>
</configuration>

저장한 연결 문자열을 사용하려면 System.Web.Configuration 네임스페이스를 import한 후 WebConfigurationManager 객체의 ConnectionString 컬렉션을 이용하여 다음과 같이 연결 문자열을 불러온다.

using System.Web.Configuration;
  ...
string connectionString = 
WebConfigurationManager.ConnectionString["AdvemtureWorks"].ConnectionString;

연결 열기와 닫기

Connection 객체를 생성하고 연결 문자열이 설정되면 데이터 소스에 연결할 준비가 끝난다. 데이터 소스와의 연결은 Connection 객체의 Open 메서드를 이용하여 명시적으로 실행한다.

conn.Open();

Open 메서드를 호출하면 데이터베이스와의 연결이 Close 메서드가 호출될 때까지 지속된다.

conn.Close();

직접 데이터에 접근하는 방식의 기본 코딩 원리는 연결을 열고 있는 총 시간을 줄이는 것이다.

 

데이터베이스 연결 열고 닫기

① 새 웹 사이트 및 새 웹 폼 만들기

새 웹 사이트를 만든 후, 코드 숨김 파일 페이지 모델을 따르는 새 페이지 'ConnectionTest.aspx'를 만든다.

② 페이지 디자인

그림과 같이 하나의 버튼 컨트롤과 레이블 컨트롤로 구성된 페이지를 구성한다.

번호 컨트롤 속성 속성 값
Button ID btnConnection
Text 연결 열기
Label ID lblConnectionInformation
Text  

③ 코드 숨김 파일 작성하기

① 네임스페이스 추가하기

ConnectionTest 클래스에서 연결 문자열과 SQL 서버 공급자를 이용한다. 따라서 연결 문자열을 이용하기 위해 System.Web.Configuration 네임스페이스를, SQL 서버 공급자를 위해 System.Data, System.Data.SqlClient 네임스페이스를 import한다.

 

② [연결 열기] 버튼 클릭 이벤트 처리기 생성하기

[디자인] 보기 창에서 [연결 열기] 버튼을 더블 클릭하여, '버튼 클릭 이벤트 처리기'를 생성한다.

 

③ [연결 열기] 버튼 클릭 이벤트 처리기 작서아기

[연결 열기] 버튼 클릭 이벤트 처리기의 처리 과정은 다음과 같다.

연결 열기는 성공할 수도 있고, 실패할 수도 있다. 연결 열기에 실패하더라도 연결 객체는 열린 상태에 있으므로 반드시 닫아주어야 한다. 이를 위해 try~catch문을 사용한다.

protected void btnConnection_Click(object sender, EventArgs e)
{
  string connectionString =
    WebConfigurationManager.ConnectionStrings["AdventureWorks"].ConnectionString;

  SqlConnection conn = new SqlConnection(connectionString);

  lblConnectionInformation.Text = "<font color='red'>";

  try
  {
    conn.Open();
    lblConnectionInformation.Text += "<b>서버 버전 : </b>" + conn.ServerVersion;
    lblConnectionInformation.Text += "<br/><br/>연결 상태 : </b>" + conn.State.ToString();
  }
  catch(Exception error)
  {
    lblConnectionInformation.Text += "<b>데이터베이스 읽기 오류</b><br/>";
    lblConnectionInformation.Text += error.Message;
  }
  finally { 
    conn.Close();

    lblConnectionInformation.Text += "<br/><b>마지막 연결 상태 : </b>" + conn.State.ToString();
  }
  lblConnectionInformation.Text += "</font>";
}

null 값이 나오는 이유는 IIS에서 설정했던 연결 문자열이 실행시키는 프로젝트의 Web.config에는 없기 때문이다.

그래서 아까 열어봤던 C:\inetpub\wwwroot\web.config 파일의 <connectionStrings> 태그 부분을 해당 프로젝트의 Web.config에 똑같이 붙여넣어주면 된다.

이거 때문인지도 모르고 MSSql과 SSMS를 지우고 다시 코드를 입력하고 반복을 했었다.

 

SELECT문으로 데이터 검색하기

데이터베이스에서 데이터를 검색하려면 Connection 객체 이외에 다음 요소들이 추가로 필요하다.

· SQL문 : 검색하고자 하는 데이터를 얻을 수 있는 질의문

· Command 객체 : SQL문을 실행하기 위한 객체

· DataReader 객체 : 결과로 반환되는 데이터를 조작하기 위해 사용하는 객체

① 연결 문자열을 읽어오고 Connection 객체 생성하기

string connectionString = WebConfigurationManager.ConnectionStrings["AdventureWorks"].ConnectionString;
                        
            SqlConnection conn = new SqlConnection(connectionString);

② Command 객체 생성, 연결 객체 할당, SQL문 작성

// SqlCommand 객체 생성
SqlCommand cmd = new SqlCommand();

// 연결 객체 할당
cmd.Connection = conn;

// SQL문 작성
cmd.CommandText = "select ProductID, Name from Production.Product where ProductSubcategoryID=7";

③ 연결 열기 -> SQL문 실행(결과 집합 얻어오기)

conn.Open();

// Command 객체의 ExecuteReader() 메서드로 SQL문 실행
// 결과 집합은 DataReader 객체에 할당
SqlDataReader rd = cmd.ExecuteReader();

④ 결과 집합의 데이터 처리하기

DataReader 객체의 Read 메서드를 통해 한 번에 하나의 레코드를 버퍼링된 결과로부터 읽어온다. 읽어온 행의 열 데이터는 열 이름으로 참조된다. 이때 열 데이터형은 object이므로 형을 적절하게 변환한다.

// 하나의 레코드를 읽어들임
rd.Read();

// 읽어들인 행의 열 데이터는 열 이름으로 참조
string name = rd["name"].ToString();
int productID = (int)rd["productid"];

⑤ DataReader 객체와 Connection 객체 닫기

rd.Close();
conn.Close();

 

INSERT, UPDATE, DELETE는 다음 글에서 이어서 작성해야겠다.

'ASP.NET 4.0' 카테고리의 다른 글

[ASP.NET] 데이터 소스 컨트롤  (0) 2022.01.13
[ASP.NET] 직접 데이터 접근(2)  (0) 2022.01.10
[ASP.NET] ADO.NET  (0) 2022.01.05
[ASP.NET] 데이터 조작어  (0) 2022.01.04
[ASP.NET] 데이터베이스의 이해  (0) 2022.01.04

댓글