카테고리 보관물: 프로그래밍

C# MySQL Connector/NET 을 이용한 연동

개요

SQL Server나 Oracle DB는 서버 라이센스 비용이 상상을 초월합니다. 그래서 웬만한 기업에서는 도입을 할 수 없습니다. 그 대안으로 MySQL, MariaDB 등을 사용하게 됩니다. .NET 기반 프로젝트라면 이전에는 SQL Server에 연동해서 작업을 진행했습니다. 라이센스 비용이 부담이 되면서 근래에는 Open Source 기반 DB를 사용하는 경우가 많아졌습니다. .NET 프레임워크에서는 기본적으로 MySQL 에 직접 연결할 수 있는 클래스는 없습니다. ODBC 클래스를 이용해서 연동을 할 수 있는 방법만 존재했습니다. 이 방법도 드라이버를 설치하고 ODBC 설정을 해야 가능합니다. MySQL 에서 제공하는 MySQL Connector 를 이용하여 연동하는 방법을 알아보도록 하겠습니다.

MySQL Connector

MySQL 홈페이지에서 다양한 언어와 플랫폼에 연동할 수 있도록 Connector 를 제공하고 있습니다. 여기에서는 Connector/NET 을 사용하도록 하겠습니다. 다음의 주소에서 다운로드 받으실 수 있습니다.

https://dev.mysql.com/downloads/connector/net/

설치는 별다른 어려움이 없으므로 설치했다고 가정하겠습니다.

연동

Visual Studio를 실행하고 ASP.NET 웹 응용 프로그램 프로젝트를 생성합니다. WinForm 프로젝트를 생성해서 진행하셔도 무방합니다. 솔루션 탐색기에서 참조를 선택하고 오른쪽 버튼을 클릭합니다. 메뉴에서 참조 추가를 선택합니다.

참조 추가 선택

참조 추가 선택

참조 관리자에서 찾아보기를 선택한 후 설치한 경로에서 MySql.Data.dll 을 선택합니다. 그러면 다음과 같이 참조가 됩니다.

MySql.Data 참조 추가

MySql.Data 참조 추가

System.Data.SqlClient 네임스페이스에 포함된 클래스 명칭 앞에 My 만 추가로 붙은 형태라고 생각하시고 사용하시면 됩니다. 예를 들면 다음과 같습니다.

SqlConnection -> MySqlConnection
SqlCommand -> MySqlCommand
.
.
.

MySQL DB 에 연결하는 코드는 다음과 같습니다.

using MySql.Data.MySqlClient;

var connectionString = "server=localhost;user=userid;database=yourdb;password=yourpassword";
var connection = new MySqlConnection(connectionString);

try
{
	Response.Write("MySQL DB 연결 중...");
	connection.Open();

	//DB 연동작업
	
}
catch (Exception ex)
{
	Response.Write(ex.ToString());
}

connection.Close();

SqlConnection 클래스를 사용한 것과 동일한 형태입니다.

다음은 MySqlCommand 클래스를 이용한 예를 살펴보겠습니다. MySqlCommand 클래스를 이용하여 쿼리한 결과를 DataTable 객체에 넣는 예제 입니다.

using System.Data;
using MySql.Data.MySqlClient;

var connectionString = "server=localhost;user=userid;database=yourdb;password=yourpassword";
var connection = new MySqlConnection(connectionString);

try
{
	Response.Write("MySQL DB 연결 중...");
	connection.Open();

	var sql = "SELECT user_name, user_id, user_password FROM your_table";
	var mySqlCommand = new MySqlCommand(sql, connection);
	var mySqlDataReader = mySqlCommand.ExecuteReader();

	var mySqlDataTable = new DataTable();
	mySqlDataTable.Load(mySqlDataReader);
	mySqlDataReader.Close();
}
catch (Exception ex)
{
	Response.Write(ex.ToString());
}

connection.Close();

예제에서 본 것과 같이 기존 Sql … 로 시작되는 클래스를 이용한 방법과 동일합니다. MariaDB 도 같은 방법으로 연동할 수 있습니다.

이상으로 MySQL Connector/NET 을 이용한 연동 방법을 알아보았습니다.

C# ReportViewer 2단 출력

개요

보고서에 자료를 출력할 때 열의 개수가 많지 않아 ReportViewer 2단 출력 을 하고 싶은 경우가 있습니다. 종이도 절약되고 보기도 좋게 출력됩니다. 그런데 이것이 어떻게 해야 하는지 알기가 어렵습니다. 이번 포스트에서는 자료를 2단으로 출력하는 방법을 알아보도록 하겠습니다.

2단 출력

2단 출력이라고 하면 다음과 같은 결과를 말합니다.

2단 출력

2단 출력

기본적으로는 위의 이미지 처럼 우측에 출력이 되지 않고 좌측에만 연속으로 출력됩니다. 2단 출력을 위해서 다음과 같이 설정합니다.

보고서 디자인 화면에서 바깥쪽을 클릭해서 보고서 속성이 나타나도록 합니다. 속성 중 Columns 항목을 펼칩니다. 기본적으로 Columns 값이 1인데 2로 변경합니다. ColumnSpacing 항목은 컬럼간 공백이므로 적절하게 조정합니다.

보고서 Columns 속성 변경

보고서 Columns 속성 변경

이렇게 변경하면 아래 이미지와 같이 2 열 이라고 보고서 디자인 화면에 나타납니다. 이 영역에는 보기만 가능하고 수정이 불가능합니다. 나타나는 영역을 미리 표시한 것으로 이해하시면 됩니다.

2 열 항목 추가

2 열 항목 추가

보고서의 테이블에 연동된 자료는 다음과 같이 정의된 클래스를 기반으로하였습니다.

public class SessionProgress
{
	public string sequenceNumber { get; set; }
	public string sessionDateTime { get; set; }
	public string show { get; set; }
	public string noShow { get; set; }
}

자료는 소스코드에서 클래스의 값을 지정하고 List 에 추가하는 방식으로 생성했습니다.

public class SessionProgressRepository
{
	public static List<SessionProgress> GetSessionProgress()
	{
		List<SessionProgress> list = new List<SessionProgress>
		{
			new SessionProgress { sequenceNumber = "1", sessionDateTime = "2018.5.21", show = "O", noShow = "" },
			.
			.
			.
			new SessionProgress { sequenceNumber = "##", sessionDateTime = "", show = "", noShow = "" }
		};

		return list;
	}
}

이렇게 정의된 클래스를 데이터 집합 추가를 통해 이용하면 됩니다. 보고서 데이터 항목 중 데이터 집합을 선택하고 마우스 오른쪽 버튼을 클릭합니다. [데이터 집합 추가…] 메뉴를 선택합니다.

데이터 집합 추가 메뉴

데이터 집합 추가 메뉴

다음과 같은 대화 상자가 나타납니다. 새로 만들기 버튼을 클릭합니다. 데이터 소스 구성 마법사 대화 상자가 나타나면 개체를 선택합니다.

데이터 집합 속성 대화 상자

데이터 집합 속성 대화 상자

데이터 소스 구성 마법사

데이터 소스 구성 마법사

다음 버튼을 클릭하면 바인딩 대상 개체 영역에 있는 항목을 확장하면 위에서 정의한 SessionProgress 항목이 있습니다. 이것을 선택하고 마침 버튼을 클릭합니다.

클래스 선택

클래스 선택

반드시 클래스 정의 후 빌드하고 개체를 추가해야 합니다. 그렇지 않으면 클래스가 나타나지 않습니다. 개체를 추가하면 클래스 항목이 나타나고 드래그해서 보고서의 테이블 자료 출력 영역에 놓습니다.

추가된 데이터 집합 항목과 보고서에 추가

추가된 데이터 집합 항목과 보고서에 추가

실행을 해보면 다음과 같이 2단으로 출력됨을 알 수 있습니다. 그런데 우측에 헤더가 출력되지 않아 어색한 느낌이 듭니다.

한번만 출력된 헤더

한번만 출력된 헤더

우측에도 헤더가 나타나도록 다음과 같이 설정합니다. 보고서 디자인 화면에서 우측 하단 부분을 보면 열 그룹이라는 항목이 보입니다. 우측에 화살표가 있는데 클릭하여 고급모드를 선택합니다.

고급 모드 선택

고급 모드 선택

고급 모드를 선택하면 행 그룹, 열 그룹이 다음과 같이 변경됩니다. 행 그룹의 (정적) 항목을 클릭하고 속성창을 보면 RepeatOnNewPage 항목이 있습니다. True로 변경합니다.

우측 열 헤더 출력을 위한 설정

우측 열 헤더 출력을 위한 설정

다시 실행해 보면 첫번째 이미지 처럼 2단 출력 되고 우측에도 헤더가 나타나는 것을 알 수 있습니다.

리포트에 자료를 연동하는 코드는 다음과 같습니다.

printPreview.LocalReport.ReportEmbeddedResource = "ReportTest.Report3.rdlc";
printPreview.ProcessingMode = ProcessingMode.Local;

printPreview.SetDisplayMode(DisplayMode.PrintLayout);

List<SessionProgress> list = SessionProgressRepository.GetSessionProgress();

printPreview.LocalReport.DataSources.Clear();

Microsoft.Reporting.WinForms.ReportDataSource dataset = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", list);
printPreview.LocalReport.DataSources.Add(dataset);
dataset.Value = list;

printPreview.LocalReport.Refresh();
printPreview.RefreshReport();

7행에서 자료 List를 생성하고 10행에서 리포트 데이터 소스 변수를 생성합니다. 데이터 집합을 생성할 때 지정한 이름을 첫번째 인수로 전달해 줍니다.

이번 포스트에서는 ReportViewer 2단 출력 에 대해 알아보았습니다.