ADO.NET 데이터베이스 프로그래밍
by EunHye Jung
ADO.NET 데이터베이스 프로그래밍
ADO.NET은 응용 프로그램에서 데이터베이스 프로그래밍을 도와주는 클래스들의 집합을 의미한다.
System.Data.SqlClient 네임스페이스와 System.Data.OleDb 네임스페이스
ADO.NET은 데이터 공급자라는 개념을 통해서 서로 다른 데이터베이스와 연동하는 프로그래밍을 할 수 있는데 각각의 DBMS와 관련된 명령들을 서로 다른 네임스페이스로 관리한다.
-
System.Data.SqlClient 네임스페이스
ASP.NET에서 데이터베이스에 대한 모든 처리를 담당하는 클래스들을 모아 놓은 네임스페이스이다.
-
System.Data.OleDb 네임스페이스
ASP.NET에서 SQLServer 데이터베이스를 포함하고 Microsoft Access 또는 Oracle과 같은 데이터베이스 관련 크래스들을 묶어 놓은 네임스페이스이다.
-
System.Data.Odbc 네임스페이스
텍스트 파일 또는 ODBC 호환 데이터 원본에 접근하기 위한 클래스들을 제공한다.
-
System.Data.OracleClient 네임스페이스
Oracle 데이터베이스에 접근하기 위한 주요 클래스들을 제공한다.
데이터베이스 연결문자열 : Connection String
C#, ASP.NET과 같은 프로그래밍 계층에서 SQL Server와 같은 데이터베이스 계층에 접근해서 데이터를 사용하고자 할 때는 데이터베이스 연결 문자열이 필요하다.
(정확한 데이터를 넘겨주어야 해당 데이터베이스에 접근가능함)
데이터베이스 연결 문자열의 필수 구성 요소 네가지는 다음과 같다.
-
Server(DataSource)
데이터베이스 서버의 위치를 나타낸다. IP 주소 혹은 도메인 정보를 입력한다.
-
Database (DB, Initial Catalog)
데이터베이스의 이름을 지정한다.
-
User ID (UID)
데이터베이스에 대한 권한에 있는 사용자 아이디를 입력한다.
-
Password (PWD)
데이터베이스에 대한 권한이 있는 사용자 비밀번호를 입력한다.
SQL Server에 접근할 수 있는 데이터베이스 연결 문자열은 다음과 같은 스타일로 지정한다.
- Server=localhost; Initial Catalog=master; Integrated Security=true;
- Server=localhost; Database=master; User ID=UserId; Passsword=xyz;
서버를 지정할 때는 다음과 같이 프로토콜, 서버명(IP 주소), 인스턴스명, 포트번호 등을 지정할 수 있다 .
- Server=tcp;ServerName\InstanceName,1433
닷넷에서 데이터베이스 처리 관련 주요 클래스
-
Connection 클래스
: DB 연결 및 종료
-
Command 클래스
: DB 명령 실행
-
DataReader 클래스
: Select 구문의 실행결과값 받기
-
DataSet 클래스
: 메모리 상의 데이터베이스(DB)로 Select와 같은 결과값 저장
-
DataAdapter 클래스
: 명령어 전달 및 실행 후 값을 DataSet 클래스에 전달
-
DataTable 클래스
: DataSet 안에 들어있는 메모리 상의 테이블 (Table)
-
DataView 클래스
: DataSet 안에 들어있는 메모리 상의 뷰(View)
SqlConnection 클래스
SQL Server에 연결해서 어떤 작업을 수행하려면, SqlConnection
클래스를 사용해야 하고, Access DB에 연결해서 작업을 할 때는 OldDbConnection
클래스를 사용해야 한다.
SqlConnection 클래스의 주요 속성 및 메서드는 다음과 같다.
-
ConnectionString
데이터베이스 연결 문자열을 설정해 SQL Server를 연결한다.
-
State
데이터베이스와의 연결 상태를 나타내는 ConnectionState 열거형을 반환하다.
ConnectionState.Open : 연결된 상태
ConnectionState.Closed : 닫혀있는 상태 -
Open()
설정된 데이터베이스 연결 문자열을 사용해 데이터베이스를 연결한다.
-
Close()
현재 연결된 데이터베이스의 연결을 해제한다.
FrmSqlConnection.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnSqlConnection" runat="server" Text="SQL Server에 연결" OnClick="btnSqlConnection_Click" />
<hr />
<asp:Label ID="lblDisplay" runat="server"> </asp:Label>
</div>
</form>
</body>
FrmSqlConnection.aspx.cs
using System;
using System.Configuration;
using System.Data.SqlClient;
namespace DevADONET
{
public partial class FrmSqlConnection : System.Web.UI.Page
{
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSqlConnection_Click(object sender, EventArgs e)
{
// [1] SqlConnection 클래스의 인스턴스 생성
SqlConnection con = new SqlConnection();
// [2] ConnectionString 속성 지정
conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectinString;
// [3] Open() 메서드 실행 : 데이터베이스 연결
con.Open();
// [!] 실행
lblDisplay.Text = "데이터베이스 연결 성공";
// [4] Close() 메서드 실행 : 데이터베이스 연결 종료
con.Close();
}
}
SqlCommand 클래스
ASP.NET에서 SQL Server에 Create, Alter, Drop, Insert, Select, Update, Delete 같은 구문을 전달하고 실행하고자 할 때는 SqlCommand 클래스를 사용한다.
SqlCommand 클래스의 주요 속성 및 메서드는 다음과 같다.
-
Connection
미리 설정되어 있는 커넥션 개체를 지정한다.
-
CommandText
실행할 SQL문이나 SP(저장 프로시저)문을 설정한다.
-
CommandType
CommandText 속성에서 지정한 구문의 형식을 CommandType 열거형으로 반환
CommandType.Text : 일반적인 SQL문
CommandType.StoredProcedure : 저장 프로시저 구문
CommandType.TableDirect : Accss DB 전용 (테이블명) -
ExecuteNonQuery()
Select문 이외의 구문을 실행하고자 할 때 주로 사용
테이블의 행에 영향을 미친 개수만큼 정수값을 반환한다 -
ExecuteReader()
Select문을 실행하고 그 결과를 SqlDataReader 개체로 반환한다
다중값 반환 : 레코드의 집합을 반환 -
ExecuteScalar()
Select문을 실행하고 첫번째 열(필드) 값을 반환한다.
단일값 반환 : 주로 집계 함수의 결과를 반환
Memos.sql
Create Table dbo.Memos
(
Num Int Identity(1,1) Primary Key, -- 번호
Name NVarChar(25) Not Null, -- 이름
Email NVarChar(100) Null, -- 이메일
Title NVarChar(150) Not Null, -- 메모
PostDate DateTime Default(GetDate()), -- 작성일
PostIP NVarChar(15) Null -- IP 주소
)
FrmSqlCommand.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnSqlCommand" runat="server" Text="입력 예시문 실행" OnClick="btnSqlCommand_Click" />
<hr />
<asp:Label ID="lblDisplay" runat="server"> </asp:Label>
</div>
</form>
</body>
FrmSqlCommand.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DevADONET
{
public partial class FrmSqlCommand : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtnSqlCommand_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
con.Open();
// [1] SqlCommand의 인스턴스 생성
SqlCommand cmd = new SqlCommand();
// [2] Connection 속성 지정
cmd.Connection = con;
// [3] CommandText 속성 설정
cmd.CommandText = @"Insert Into Memos Values(N'이름', N'email@github.om', N'Hello', GetDate(), '127.0.0.1')";
// [4] CommandType 속성 지정
cmd.CommandType = CommandType.Text;
// [5] ExecuteXXX() 메서드로 실행
cmd.ExecuteNonQuery();
// [6] 마무리
lblDisplay.Text = "데이터 저장 완료";
con.Close();
}
}
}
SqDataReader 클래스
ASP.NET에서 커맨드 개체를 사용해 SQL Server에 Select문을 실행한 결과를 받아올 때 SqlDataReader를 사용한다.
Select 문의 결과를 화면에 출력하려고 반드시 SqlDataReader 클래스를 사용해야하는 것은 아니다. (Data 컨트롤을 사용해 쉽게 구현하는 방법도 있음!)
SqlDataReader 클래스의 주요 속성 및 메서드는 다음과 같다.
-
FieldCount
Select 문의 실행 결과에서 필드(열)의 개수
-
HasRows
Select 문을 실행한 후 반환될 레코드가 있다면 true
-
Read()
레코드가 있는 만큼 반복
-
Close()
데이터 리더 개체를 닫는다
-
GetXXX()
XXX 형식으로 필드(칼럼)값을 반환한다
FrmSqlDataReader.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="tblOutput" runat="server"> </asp:Literal>
</div>
</form>
</body>
FrmSqlDataReader.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
namespace DevADONET
{
public partial class FrmSqlDataReader : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DsiplayData();
}
}
private void DisplayData()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = @"Select Num, Name, Email, Title, PostDate, PostIp From Memos Order By Num Desc";
cmd.CommandType = CommandType.Text;
// [1] SqlDataReader 형식의 개체로 결과값 받기
SqlDataReader dr = cmd.ExecuteReader();
// [2] Read() 메서드로 데이터 있는만큼 반복
string strOutput = "<table> <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.GetDataTime(4).ToShortDataString()}</td>";
}
strOutput += "</table>";
// [3] Close() 메서드로 연결된 리더 개체 종료
dr.close();
// [!] 출력
tblOutput.Text = strOutput;
con.Close();
// end of DisplayData()
}
}
}
SqlDataAdapter 클래스와 DataSet 클래스
DataSet 클래스는 ‘메모리 데이터베이스’로 정의할 수 있다.
즉, 메모리에 필드와 레코드로 이루어진 테이블을 여러개 올려놓는다. 그리고 해당 테이블 간의 관계를 설정하고, 각각의 테이블에서 데이터를 입력, 출력, 수정, 삭제, 검색하는 일반적인 데이터베이스 처리 로직을 구현한다.
DataSet 클래스가 Select문의 실행 결과를 담아 놓는 그릇 역할을 한다면, SqlDataAdapter 클래스를 Select문을 실행시키고 실행된 결과값을 가져다가 DataSet 개체에게 채워주는 중간 매개체 역할을 한다.
SqlDataAdapter와 DataSet 클래스로 데이터 출력하기FrmSqlDataAdapter.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="ctlMemoLists" runat="server"> </asp:GridView>
</div>
</form>
</body>
FrmSqlDataAdapter.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DevADONET
{
public partial class FrmSqlDataAdapter : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = @"Select Num, Name, Email, Title, PostDate, PostIP From Memos Order By Num Desc";
cmd.CommandType = CommandType.Text;
// [1] DataAdapter
SqlDataAdapter da = new SqlDataAdapter();
// [2] SelectCommand 지정
da.SelectCommand = cmd;
// [3] DataSet : 메모리상의 데이터베이스
DataSet ds = new DataSet();
// [4] Fill() 메서드로 DataSet 채우기
ds.Fill(ds, "Memos");
// [!] 출력
ctlMemoLists.DataSource = ds.Table[0].DefaultView; // ds만 지정가능
ctlMemoLists.DataBind();
con.Close();
}
}
}
Subscribe via RSS