C# 과 MySQL 연동

C#/C# SQL 2015. 8. 29. 00:30
728x90

책보고 네이버/구글 폭풍검색하다보니 좀 정리가 되는거 같다.

도식화된 그림은 구글 이미지 검색해서 찾았다.


C#에서 데이터베이스에 연결하는 방법은 세가지 방법이 있다.

ㅇ C# 과 DB 직접 접속방식 (기업 내부에 서버가 있는 경우)

   - 연결형으로 데이터베이스 사용하기

   - 비연결형으로 데이터베이스 사용하기

ㅇ C# 과 DB 간접 접속방식

   - C# - PHP(JSP, ASP) - DB (보안문제 해결)


아래 설명은 DB 직접 접속방식에 대한 설명이다.

SQL 연결방식은 SQL Server, MySQL, Oracle 등 모두 동일한 방식으로 제공하고 있다.

어떤 DB에 접속하는지 식별할 수 있게 하는 것만 다르다.



C# 과 MySQL 을 연동하기 위해서 가장 먼저 해야 할 일은 아래의 네임스페이스들을 참조해야 한다.

using System.Data;  // DB처리 관련된 일반 클래스

//Include mysql client namespace.
using MySql.Data.MySqlClient;
using System.Configuration;

* 연결하는 DB에 따라 참조하는 네임스페이스는 달라진다.


Mysql 데이터 연결
MySQL 데이타베이스를 연결하기 위해서는 MySqlConnection 클래스를 사용한다.

//Read connection string from application settings file (데이터베이스 연결)
string  ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"];  // DB 연결 정보

MySqlConnection myConn// 보통 Conn 으로 표현되어 있고, AccessConn 은 액세스 연결, myConn 은 MySQL 연결
myConn = new MySqlConnection(ConnectionString);

MySQL 데이터를 C# 으로 가져오기 위해서는

MySqlCommand / MySqlDataReader (연결형 데이터베이스 사용)

또는 

MySqlCommand / MySqlDataAdapter (비연결형 데이터베이스 사용)

를 사용한다.



1. 연결형으로 데이터베이스 사용하기


MySqlCommand 는 모든 SQL 구문을 실행시켜 주는 담당 객체 (select, update, delete, insert, create, drop 등)

string sql = "select * from TableName where 조건";
MySqlCommand cmd = new MySqlCommand(sql, myConn);

MySqlDataReader는 연결모드로 데이터를 서버에서 가져온다.

Query 문에서 어떠한 값이 리턴 될지 모르기 때문에 Object형으로 반환된다.
따라서 반환값을 적절히 변환하여 사용해야 한다.
또한 Query의 결과 값이 여러 개의 행과 열을 가질 수 있는데, 이런 경우에는 첫 번째 행의 첫 번째 열의 값이 리턴된다.


ExecuteReader는 여러 개의 행과 열을 동시에 가져올 때 사용한다. 삽입, 삭제, 수정 등은 할 수 없다.

주로 Select 명령문을 실행하고 그 결과셋을 SqlDataReader 타입의 객체로 리턴한다.

string sql = "select * from items order by uid desc";
myConn.Open();  // mysql DB 연결
MySqlDataReader R = new MySqlCommand(sql, myConn).ExecuteReader();

* MySqlDataReader 는 record 단위로 접근하며, 하나의 reader 가 열려 있으면 또다른 reader는 열수가 없다.

while (R.Read())    // 칼럼을 배열처럼 사용하여 R[0]는 첫번째 칼럼,  R[1] 은 두번째칼럼
{   // R 은 한번에 하나의 레코드에만 접근 가능

    // R['uid'], R['name'] 으로 칼럼을 직접 명기할 수 있다.
    label1.text = R[0].ToString();  // string name = R.GetString(0);

    label2.text = R[1].ToString();
}
R.Close();   // 쿼리문 결과 닫기. reader 로 열였으면 반드시 닫아주어야 한다.
myConn.Close();  // mysql DB 연결 종료


ExecuteNonQuery는 결과를 받을 필요가 없는 Query문에 사용된다
보통 Insert문이나 Update문은 결과를 받을 필요가 없기 때문에, Insert, Update 문에서 많이 사용한다
위와 같은 Query에서는 몇 개행에 적용되었는지가 중요한데, ExecuteNonQuery는 적용된 행의 개수를 리턴해준다
string qry ="UPDATE items SET Quantity=10 WHERE uid='" + user_id +"'";
MySqlCommand cmd = new MySqlCommand(qry, myConn);
myConn.Open();
cmd.ExecuteNonQuery();
myConn.Close();

ExecuteScalar는 Query문에서 1개의 값을 가져올 때 사용한다.
결과가 딱 1개인 집계함수(count, sum, avg, max, min 등)에 사용한다.


2. 비연결형으로 데이터베이스 사용하기


비연결형의 핵심은 메모리에 구축된 DB인 DataSet 클래스이다. 메모리상의 오프라인 DB라고 할 수 있다.

SQL Server, Oracle, MySQL 같은 DBMS의 테이블은 물론이고 Excel Worksheet, XML 파일, 텍스트파일까지도 DataSet 에 넣어 놓고 관리할 수 있다. 단점은 대량의 데이터를 메모리에 계속 보유해야 하므로 Client(PC, 노트북)의 리소스를 엄청 소모할 수 있다.

MySqlDataReader는 연결모드로 데이터를 서버에서 가져오는 반면, (메모리 공간 별로 차지하지 않음)
MySqlDataAdapter는 한꺼번에 클라이언트 메모리로 데이터를 가져온 후 연결을 끊는다.

MySQL DB 와 연결이 끊어져 있어도 SQL 작업이 가능하다.

받은 전체 데이터(MySqlDataAdapter)는 주로 로컬에 있는 DataSet 객체 안에 메모리상의 테이블 형태로 존재하는데, 이를 각종 컨트롤들에게 바인딩 시킬 수 있다.


MySqlDataAdapter adapter;
string sql = "select * from items order by uid";
adapter = new MySqlDataAdapter(sql, myConn);
DataSet DS = new DataSet();
adapter.Fill(DS);

MySqlCommand 로 Update, Insert, Delete Query 문 처리하고

DS.Tables[0];


DataTable ds;

dataGridView1.DataSource = ds;  // DataSource 에 DataTable 객체를 대입하면 테이블이 표형식으로 출력


* 테이블의 실제 데이터를 저장하는 것은 Record(행)이며 행은 DataRow 클래스로 표현한다.


도움되었다고 생각되면 공감 꾸욱 눌러주세요.


블로그 이미지

Link2Me

,