C# 에서 데이터베이스에 연결하고 데이터를 가져오는 여러 가지 방법이 있습니다. 여기에서는 가장 빠르고 효율적인 방법을 설명합니다.
ADO.NET, EntityFramework, Dapper등을 활용한 방법이 대표적이며 그중 간단하게 사용할 수 있는 경량엔진 Dapper를 소개합니다.
Dapper 사용하여 값을 Select하고, Insert하는 간단한 방법을 실습해 보겠습니다.
Dapper 소개
Dapper는 SQL 쿼리를 실행하고 결과를 .NET 개체에 매핑할 수 있는 간단하고 가벼운 ORM(객체 관계 매핑) 프레임워크입니다. 이를 통해 데이터베이스와의 상호 작용을 간편하게 처리할 수 있습니다. Dapper는 특히 대규모 데이터 세트를 처리할 때 빠르고 효율적이며, 원시 SQL 쿼리를 사용하므로 SQL 실행을 완전히 제어할 수 있습니다. 또한 사용하기 쉽고 학습 곡선이 작아 인기를 끌고 있습니다.
다음은 Dapper를 사용하여 SQL Server 데이터베이스에서 고객 목록을 검색하는 방법의 예입니다:
using System;
using System.Data.SqlClient;
using Dapper;
using System.Linq;
using System.Collections.Generic;
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
// 다른 속성들 추가
}
public class Program
{
public static void Main()
{
string connectionString = "your_connection_string_here";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var customers = connection.Query<Customer>("SELECT * FROM Customers");
foreach (var customer in customers)
{
Console.WriteLine($"ID: {customer.Id}, Name: {customer.Name}");
}
}
}
}
이 예제에서는 먼저 연결 문자열을 사용하여 SQL Server 데이터베이스에 대한 연결을 만듭니다. 그런 다음 Query
메서드를 사용하여 SQL 쿼리를 실행하고 결과를 Customer
개체 목록에 매핑합니다. 마지막으로 고객 목록을 반환하고 출력합니다.
예제 및 실습
우리는 여기에서 DB를 MSSQL 을 사용할 것이며 DATABASE는 MS 에서 제공하는 Sample Database를 사용 할 것입니다.
아래 링크에서 다운받을 수 있습니다.
https://learn.microsoft.com/ko-kr/dotnet/framework/data/adonet/sql/linq/downloading-sample-databases
C# .netframework 콘솔앱 으로 예제를 만들어 보도록 하겠습니다. 또한 Northwind 의 Categories 테이블을 이용해 보도록 하겠습니다.

예제 1 SELECT
- .netframework 콘솔앱 생성
- nuget 에서 Dapper 를 설치한다.

- App.config 에 연결문자열을 설정한다.
<connectionStrings>
<add name="SqlServerConnString" providerName="System.Data.SqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=Northwind;User ID=*****;Password=*****;Encrypt=False" />
</connectionStrings>
- 테이블에 매핑된 클래스를 만들어준다.
public class Categories
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string Description { get; set; }
}
- Connect Database
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
- Query
String query = "select * from Categories";
var value = (List<Categories>)db.Query<Categories>(query);
이러면 value 변수에 모든 테이블 값들이 List 로 저장되게 됩니다.
전체 코드를 보면
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using Dapper;
namespace ConsoleApp1
{
internal class Program
{
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
static void Main(string[] args)
{
String query = "select * from Categories";
var value = (List<Categories>)db.Query<Categories>(query);
foreach (var category in value)
{
Console.WriteLine(category.CategoryID);
Console.WriteLine(category.CategoryName);
Console.WriteLine(category.Description);
Console.WriteLine();
}
}
}
public class Categories
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string Description { get; set; }
}
}
출력은 다음과 같습니다.

예제 2 Insert
- Insert 를 위해 다음 코드를 사용합니다.
Categories category = new Categories() { CategoryName="Dapper", Description ="Dapper Test"};
string query = @"Insert into Categories values (@CategoryName, @Description);
SELECT CAST(SCOPE_IDENTITY() AS INT) ";
int CategoryID = db.Query<int>(query, category).Single();
DB 에 저장된 값을 보겠습니다.

다음 코드
SELECT CAST(SCOPE_IDENTITY() AS INT)
는 마지막으로 삽입된 테이블의 ID 를 반환합니다.
자동으로 추가되는 ID 값을 받아 올때 사용합니다.
다음은 Full Source 입니다.
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using Dapper;
using System.Linq;
namespace ConsoleApp1
{
internal class Program
{
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
static void Main(string[] args)
{
Categories category = new Categories() { CategoryName="Dapper", Description ="Dapper Test"};
string query = @"Insert into Categories values (@CategoryName, @Description);
SELECT CAST(SCOPE_IDENTITY() AS INT) ";
int CategoryID = db.Query<int>(query, category).Single();
}
}
public class Categories
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string Description { get; set; }
}
}
Dapper의 장단점
Dapper의 장점
- 코드가 간결하고 이해하기 쉬움.
- ADO.NET과 거의 동일한 성능 제공.
- 객체 매핑 기능 지원.
Dapper의 단점
- 기본적인 자동화 기능 부족.
- 쿼리를 직접 작성해야 하므로 복잡한 SQL 관리가 어려울 수 있음.
결론
Dapper는 SQL 쿼리를 실행하고 결과를 .NET 개체에 매핑할 수 있는 간단하고 가벼운 ORM 프레임워크입니다.
빠르고 간단하게 프로그램을 개발할때 가장 적합한 프레임워크입니다.