책보고 네이버/구글 폭풍검색하다보니 좀 정리가 되는거 같다.
도식화된 그림은 구글 이미지 검색해서 찾았다.
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 등)
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 연결 종료
보통 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 클래스로 표현한다.
'C# > C# SQL' 카테고리의 다른 글
C# MySQL 간단 코드 및 접속 기본지식 배우기 (0) | 2015.12.04 |
---|---|
C# MySQL 쿼리문과 연동 처리 (0) | 2015.09.12 |
C# 콤보박스(comboBox) 와 SQL 연동 (0) | 2015.09.10 |
C# ExecuteScalar 와 총 Record 수 (0) | 2015.08.27 |
C# 과 MySQL 연결을 위한 준비 (0) | 2015.08.05 |