본문 바로가기
대한상공회의소 스마트팩토리 교육/데이터베이스

[데이터베이스 운영] DBMS 기초 «수업-5» : 데이터베이스(DB) 연동 프로그래밍 기초 Using C# - ① : CUI 환경

by 나는영하 2022. 4. 27.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 


데이터베이스(DB) 연동


 

안녕하세요.

여태까지 DBMS를 활용해서 데이터베이스와 테이블을 만들고

데이터를 입력 / 수정 / 삭제 / 조회를 하는 방법에 대해 알아보았습니다.

오늘은 이러한 데이터베이스(My SQL)를 C#으로 연동해서 C#으로 DB를 처리하는 과정을 알아보겠습니다. 

 

1. 데이터베이스 연동 개요

여러 DBMS중에 My SQL을 C#과 연동시키는 방법을 알아보겠습니다.

My SQL을 통해 과정을 이해하면 다른 DBMS도 방법은 비슷하니 쉽게 적용할 수 있습니다. 

 

데이터베이스와 C#간에 연결하는 과정교량을 통해 트럭이 짐을 싣고 운반하는 과정으로 대입해서 이해하기 쉽도록 설명하겠습니다. 

 

(1) 교량 건설 --> 데이터베이스(DB)와 연결

1단계는 교량을 건설하는 단계입니다.

Server 컴퓨터(DB)와 Windows 컴퓨터 (C#)간에 연결을 합니다. 

연결을 하는데 필요한 정보는 IP주소(Server), DB 사용자 아이디(Uid), 비밀번호(Pwd), 데이터베이스 이름(Database), 문자 관련(Charset) 정보 정도가 있습니다. (괄호안은 연결할때 사용해야할 변수 명)

위의 정보를 바탕으로 MySqlConnection 클래스를 선언합니다. 

 

// 1단계. 교량 건설 --> 데이터베이스 연결
String connStr = "Server = 192.168.56.101; Uid = smartUSER; pwd = 1234; Database = sakila; Charset = UTF8 ";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();

ConnStr 변수 안에 IP, ID, Password, Database이름, 문자 관련 정보를 저장합니다.

여기서 문자관련(Charset) 안에 UTF8을 넣어줌으로써 한글이 깨지지 않게 해주는데 DB의 종류에따라 생략하는 경우도 있습니다. 

 

✔ 참고로! 로그인시 아이디의 대소문자는 반드시 구분해서 입력해야합니다. (Workbench를 통해 연결할때는 대소문자 구분이 필요 없었지만 C#에서는 구분지어야 합니다!!)


(2) 짐을 실어서 나를 트럭 준비 --> SQL문을 보낼 클래스 준비

사용자가 C#에서 SQL문을 작성해서 보낼 클래스(MySqlCommand)를 선언합니다. 

 

// 2단계. 짐(SQL)을 실어서 나를 트럭 준비 --> MySqlCommand 생성
MySqlCommand cmd = new MySqlCommand("", conn);

 

dev.mysql.com 설명서 참고

 

MySqlCommand("문자열", "MySqlConnection") : 쿼리 텍스트 및 MySqlConnection을 사용하여 MySqlCommand 클래스의 새 인스턴스를 초기화 합니다. 

 


 

(3) 짐을 트럭에 실어서 교량을 건너 목표지에 부어넣기 --> SQL문을 외부네트워크를 거쳐서 DB에 입력

① 트럭에 짐 싣기

String 배열에 SQL문을 입력해서 MySqlCommand.CommandText 클랙스 속성에 저장합니다.

 

② 목적지에 짐 붓기

MySqlCommand.ExecuteNonQuery 메서드를 사용해서 쿼리문을 DB에 적용시킵니다. 

 

// 3단계. 짐을 트럭에 실어서 교량을 건너 목표지에 부어넣기 
// 짐 준비
String str = "INSERT INTO new_staff VALUES(3, 'YOU', 'YOUNGHA', 179, '1992-04-16'";
// 짐을 트럭에 싣기 
cmd.CommandText = str;
// 교량 건너서 붓기
cmd.ExecuteNonQuery();

지금은 간단한 예시로 new_staff에 1개의 데이터를 입력하는 쿼리문(짐)을 트럭에 실었습니다. 


(4) 교량 철거 --> 데이터베이스(DB)와 연결 해제

SQL문을 보내기 위해 선언한 MySqlConnection 클래스를 닫습니다(Close)

// 4단계. 교량 철거 --> 데이터베이스 연결 해제
conn.Close();
Console.WriteLine("db작업을 완료하였습니다.");

 

기본적인 DB와 C#간의 연동을 위한 프로그래밍 순서는 위와 같습니다. 

디테일은 아래에서 캡처를 통해 하나씩 확인해보겠습니다. 


2. 데이터베이스 연동 실습 - ① : 입력(INSERT) / 수정(UPDATE) / 삭제(DELETE)

2-1. MySqlConnector 패키지 설치 

C#은 DB를 인식하는 기능이 자체적으로는 없지만 데이터베이스 벤더(?)들이 기능을 만들었다고 합니다.

이러한 패키지는 C#의 상단메뉴에 프로젝트의 "NuGet 패키지 관리"를 통해 다운받을 수 있습니다. 

"NuGet 패키지 관리" → 찾아보기 → "MySqlConnector" 검색 → 설치

 

이러한 소스패키지들은 C#에 설치하는 개념이 아닌 프로젝트에 설치하는 개념이기 때문에

프로젝트가 바뀔때마다 소스패키지들을 새로 설치해주셔야 합니다!!  

 

using문

해당 패키지를 사용하기 위한 using문은 using MySqlConnector; 입니다. 

 


2-2. 입력 / 수정 / 삭제 프로그램 코드 전문 

먼저 실습을 진행하기위해 간단한 테이블을 생성해서 일부 데이터들을 다른테이블에서 가져오도록 하겠습니다.

USE sakila;
DESC staff;
SELECT * FROM staff;
CREATE TABLE new_staff(
	STAFF_id TINYINT UNSIGNED PRIMARY KEY,
    first_name VARCHAR(45),
    last_name VARCHAR(45),
    height SMALLINT,
    birth DATE    
);
INSERT INTO new_staff 
	SELECT staff_id, first_name, last_name, null, null 
    FROM staff;
SELECT * FROM new_staff;

결과 테이블

staff 테이블에서 id와, 이름만가져오고 나머지 키와 생일에 대한 값은 NULL값으로 저장하였습니다.

앞으로 저장하는 데이터는 키와 생일도 입력해보도록 하겠습니다:)

 

(1) 입력(INSERT)

입력 쿼리문을 수행하기위한 C# 코드 전문입니다.

사실 입력 / 삭제 / 수정을 위한 코드는 str 변수에 들어가있는 String값 즉 쿼리문만 수정해주면 됩니다.

(SELECT 즉 조회는 조금 더 수정을 해주어야 합니다..)

static void Main(string[] args)
        {
            // 1단계. 교량 건설 --> 데이터베이스 연결
            String connStr = "Server = 192.168.56.101; " +
                "Uid = smartUSER; " +
                "pwd = 1234; " +
                "Database = sakila; " +
                "Charset = UTF8 ";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            // 2단계. 짐(SQL)을 실어서 나를 트럭 준비 --> MySqlCommand 생성
            MySqlCommand cmd = new MySqlCommand("", conn);

            // 3단계. 짐을 트럭에 실어서 교량을 건너 목표지에 부어넣기 
            // 짐 준비
            String str = "INSERT INTO new_staff " +
                "VALUES(3,'YOU', 'YOUNGHA', 179, '1992-04-16')";
            // 짐을 트럭에 싣기 
            cmd.CommandText = str;
            // 교량 건너서 붓기
            cmd.ExecuteNonQuery();
            
            // 4단계. 교량 철거 --> 데이터베이스 연결 해제
            conn.Close();
            Console.WriteLine("db작업을 완료하였습니다.");
        }

 

위의 코드 수행결과 DB작업을 정상적으로 완료했다는 창이뜨고 DB에 새로운 데이터가 입력되었음을 알 수 있습니다.

결과 창

아래와 같이 두개씩 입력도 가능합니다.

데이터를 더 많이 입력한다면 FOR문을 이용해도 되겠죠? 응용방법은 다양할 것 같습니다. 

 

(2) 수정(UPDATE)

 

 // 짐 준비
String str = "UPDATE new_staff SET last_name = 'JISUNG' WHERE STAFF_ID = '3'";

 

수정을 하기위해선 쿼리문을 저장하는 str변수의 값만 변경해주면됩니다.

수정이니 UPDATE문을 활용해서 기존의 데이터를 수정해보도록 하겠습니다!

다른코드는 위의 입력과 동일합니다.

3번 행 데이터 수정 완료!

참고로 수정 및 삭제를 위한 WHERE절을 사용할때는 반드시 PRIMARY KEY에 해당되는 열을 사용해주셔야합니다. 아니면 뜻하지 않게 중복되는 데이터가 삭제되는 불상사가 발생할 수 있습니다.

 

(3) 삭제(DELETE)

 // 짐 준비
String str = "DELETE FROM new_staff WHERE STAFF_id = 3";

new_staff 테이블의 STAFF_id가 3인 데이터(행)를 삭제하였습니다.

3번 행 데이터 삭제 완료!

 


2-3. 응용

위에서 직접 쿼리문을 String 배열안에 넣어서 데이터를 입력하고, 수정하고, 삭제해보았습니다. 하지만 이는 실제로 사용하기엔 매우 부적합합니다. (사용자가 직접 C#을 통해 쿼리문을 작성해서 데이터를 수정해야 하는 번거로움...)

 

그래서 조금 응용해보고자 합니다.

사용자가 키보드를 통해 DB에 저장하고자 하는 데이터를 직접 입력해보도록하겠습니다. 

Consol.ReadKey()를 사용해서 Staff_id, first_name, last_name, height, birth를 입력하고 실제로 데이터가 저장이 되는지까지 확인해 보겠습니다. 

// 3단계. 짐을 트럭에 실어서 교량을 건너 목표지에 부어넣기 
// 짐 준비
int STAFF_id, height;
String first_name, last_name, birth;

Console.WriteLine("ID 번호를 입력해 주세요 : ");
STAFF_id = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("성(FirstName)을 입력해 주세요 : ");
first_name = Console.ReadLine();
Console.WriteLine("이름(lastName)을 입력해 주세요 : ");
last_name = Console.ReadLine();
Console.WriteLine("키를 입력해 주세요(cm) : ");
height = int.Parse(Console.ReadLine());
Console.WriteLine("생년월일을 입력해 주세요 : ");
birth = Console.ReadLine();

String str = "INSERT INTO new_staff VALUES('"+ STAFF_id  + "',' " + first_name + "',' " + last_name + "','" + height + " ',' " + birth +"')";
// 짐을 트럭에 싣기 
cmd.CommandText = str;

 

결과를 확인해보겠습니다.

C#의 Consol.ReadLine을 통해 사용자가 키보드로 입력한 값이 DB에 잘 저장되어있음을 알 수 있습니다!! GOOD!


3. 데이터베이스 연동 실습 - ② : 조회(SELECT)

static void Main(string[] args)
        {
            // 1단계. 교량 건설 --> 데이터베이스 연결
            String connStr = "Server = 192.168.56.101; " +
                "Uid = smartUSER; " +
                "pwd = 1234; " +
                "Database = sakila; " +
                "Charset = UTF8 ";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            // 2단계. 짐(SQL)을 실어서 나를 트럭 준비 --> MySqlCommand 생성
            MySqlCommand cmd = new MySqlCommand("", conn);

            // 3단계. 짐을 트럭에 실어서 교량을 건너 목표지에 부어넣기 
            // 짐 준비
            String str = "SELECT STAFF_id, last_name, birth FROM new_staff";
            // 짐을 트럭에 싣기 
            cmd.CommandText = str;
            // 교량 건너서 붓고 쌓인 결과를 연결한 끈만 가져오기
            // cmd.ExecuteNonQuery(); --> 입력 / 수정 / 삭제를 위한 메서드
            MySqlDataReader reader;
            reader = cmd.ExecuteReader(); // --> 조회(SELECT)를 할때는 Reader

            // 3-1단계. 트럭이 가져온 결과를 한번씩 톡톡 당기기 
            int STAFF_id;
            string last_name, birth;

            while(reader.Read()) // 톡 당기기
            {
                STAFF_id = Convert.ToInt16(reader["STAFF_id"]);
                last_name = (string)reader["last_name"];
                birth = reader["birth"].ToString();
                Console.WriteLine(STAFF_id + " a"+ last_name + " " + birth);
            }
            
            // 4단계. 교량 철거 --> 데이터베이스 연결 해제
            conn.Close();
            Console.WriteLine("db작업을 완료하였습니다.");
        }

DB를 조회하는 과정은 3단계가 전체적으로 달라졌습니다. 

쿼리문을 저장하는 변수 Str은 당연히 변하고, 해당 쿼리문을 실어서 옮길 메서드들이 달라졌습니다.

입력 / 수정 / 삭제  : MySqlCommand.ExecuteNonQuery();

조회 : MySqlCommand.ExcuteReader();

 

또한 추가로 Console.WriteLine을 통해 DB를 표시해야되기 때문에 SELECT문에서 조회하는 열에 해당하는 변수들을 지정하고 해당 변수에 DB값을 저장해 주어야 합니다.

 

위의 코드를 통해 저는 new_staff 테이블의 id와 last_name 그리고 birth 값만을 조회해 보겠습니다.

(좌) C#으로 조회한 데이터 / (우) 실제 DB에 저장된 데이터

한가지 이상한 점이 있다면 DB에는 birth의 Date값이 연월일만 저장되어있는데, C#으로 조회할때 String으로 형변환하는 과정에 있어서 문제가 있었는지 DateTime의 형태로 변환된 것을 확인할 수 있습니다. 이는 조금더 찾아보고 수정을 해야할 것 같습니다!

 

 

다음에는 C#의 GUI환경 즉, Windows Form을 통해 DB에 좀 더 재밌고 편하게 연동시켜보겠습니다!

댓글