본문 바로가기

C# 윈도우 프로그래밍

c# 프로그래밍 mysql/Maria DB 연동하기

 

이번 장에서는 c# 프로그래밍 중에서 mysql과 maria db와 연동하는 방법에 대해 설명하겠습니다.

 

mysql과 Maria 데이터 베이스 둘이 같이 써놓는 이유는 c# 프로그래밍 에서 연동하는건 동일 하기 때문이다.

 

단지 mysql이 오라클이 인수하게 됨으로써 무료 라이센스 정책이 변화 되었고 maria db 는 이러한 정책에 대해 

 

반발하여 기존 mysql 개발자 진이 만들게 된것이라 불러오고 연동하는건 동일하다. 

 

여기에서는 마리아db로 연동하는 예시를 들것이다.(결론적으로는 똑같긴함)

 

이제 연동하려면 먼저 두가지 방법이 있는데 

 

1.  커넥터만 직접 다운받아 설치.

 

mysql/maria db 연결 커넥터

검색사이트에서 mysql connector만 검색하면 위에 사이트가 나오니 검색해서 들어가던가

 

위에 보이는 사이트를 직접 쳐서 들어간다음 자신의 운영체제에 맞는 버전을 찾아서 설치하면 된다.

 

c# 프로그래밍을 할것인데 당연히 윈도우에 해야되는게 맞긴 하겠죠????.... 물론 gtk+ c# 프로그래밍 하려면 

 

mono 버젼 깔면 됨.

 

위에 처럼 윈도우 버젼 클릭하면 windows(x86,32-bit) msi installer가 나오는데 그 옆에 download를 클릭하게 되면 

이런식으로 막 로그인하라고 뜨는데 필요없이 밑에 파란색 줄로 된  No thanks, just start my download.

 

이 부분을 클릭해서 다운 받으면 된다.

 

그 다음에 다운받은 파일을 더블 클릭하게 되면 이제 설치가 시작되는데

 

아래의 사진처럼 떳을때 

 

Typical을 클릭해서 그냥 Next Next 눌러가면서 설치하면 된다. 물론 custom해서 필요없는거 좀 빼면서 가볍게 설치해도 되는데 거의 차이가 안나고 귀찮기만 하다.

그냥 typical로 설치하자.

이때 주의할것은 하나도 없으니 그냥 설치

설치 완료한다음에는.

c#에서 자신이 코딩할 프로젝트를 생성하고 windows Form앱이나 wpf앱이나 그냥 콘솔앱이던지

mono gtk+ form앱이 던지 아무 상관없다 그냥 자신이 코딩할 프로젝트 생성.

밑에 예시에서는 windows forms 앱(.NET Framework)로 예를 들면,

 

이렇게 고른다음 다음버튼을 클릭하고 프로젝트명을 자신이 원하는데로 아무렇게나 예를들면 maria tester 이런식으로

프로젝트가 생성되는데 이 프로젝트의 솔루션 탐색기에서 참조추가로 mysql.data를 추가해주면 이제 커넥터가 연결된 것이다. 아래 그림 참조할것.

찾아보기에서 my 이런식으로 검색하면 나오니 체크한다음에

 

확인 버튼 클릭하면 참조가 완료된다.

 

참고로 커넥터를 다운받아서 설치하지 않으면, 위와같은 참조가 뜨지 않으니.

 

꼭 커넥터부터 설치하고 참조를 추가할것.

 

2.  Nuget패키지관리자로 설치하기.

 

이거는 복잡하게 인터넷 브라우저로 커넥터를 다운받고 이럴 필요 없이 c# 프로그래밍에서 가장 강력한

 

nuget패키지 관리자로 설치하는 것이다. 이 nuget패키지 관리자는 c# 프로그래밍을 사용하는 유저들이 편하게 

 

코딩을 할 수 있게 패키지들을 묶어놔서 그냥 설치하기 하나로 설치해서 그 라이브러리들을 쓸수 있게 해 놓은것이다.

 

연관된 패키지도 알아서 깔아주니 다운되거나 에러날 확률을 확 낮추어주어 무엇보다도 개발 하는데 속도를 매우 

 

빠르게 해준다.

 

설치방법은 비주얼스튜디오에서 프로젝트 생성한다음.

 

도구=> Nuget 패키지 관리자 => 솔루션용 NuGet 패키지 관리..를 아래와 같이 클릭하면.

이제 아래와 같이 솔루션 패키지 관리 창이 뜨게 되는데

 

그 솔루션 패키지 관리창에서

 

찾아보기 탭 클릭 후 검색으로 mysql을 검색하면 MysqlData라는 패키지가 검색될것이다.

 

그 패키지를 선택후 설치 버튼을 누르면 끝이다. 아까 첫번째 커넥터 설치하는것보다 매우 쉽게 사용이 가능한데 

 

첫번째 커넥터 설치한것과 비교해서 단점은 불필요한것도 많이 깔아서 프로그램이 조금 무거워진다는데 있다.

 

근데 다른 PC에서도 사용하고 할때 아무래도 패키지 관리자로 까는게 이식하는데 편하니 되도록 2번째 방법을 

 

쓰는 것을 강력 추천한다.

이제 사용할 준비가 다 끝났으면 본격적으로 사용을 해볼 것인데.

 

windows forms앱으로 코딩을 설명할 것이다.

기본적으로 패키지나 커넥터가 참조가 되었으면 

using으로 라이브러리를 사용한다는걸 명시해줘야되는데.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 

이런식으로 처음 프로그램만들때 명시된 곳 제일 밑에

using Mysql.Data.MysqlClient;
 

이 줄을 한줄 추가해주면 된다.

 

그다음 로그인 완료 버튼 이벤트가 추가된 상태에서 아래와 같은 이벤트 안에

private void LoginButtonOk(object sender,EventArgs e)
{
}
 

로그인 되는 코드를 삽입하면 되는데

private void LoginButtonOk(object sender,EventArgs e)
{
            string host="test.synology.me";
            string port = "3307";
            string database = "testDB";
            string userDB = textBoxID.Text;
            string password = textBoxPW.Text;
            string cn = "server=" + host + ";Port=" + port + ";Database=" + database + ";User ID=" + userDB + ";Password=" + password;
            buttonOK.Enabled = false;
            buttonCancel.Enabled = false;
            textBoxID.ReadOnly = true;
            textBoxPW.ReadOnly = true;
            dbCon(cn);
}
private void dbCon(string con)
{
     try
     {
                conn = new MySqlConnection(con);
                conn.Open();
                pasvalue = conn;
                Properties.Settings.Default.username = textBoxID.Text;
                this.DialogResult = DialogResult.OK;
      }
      catch (Exception ex)
      {
                MessageBox.Show(ex.ToString());
                textBoxID.Clear();
                textBoxPW.Clear();
                buttonOK.Enabled = true;
                buttonCancel.Enabled = true;
                textBoxID.ReadOnly = false;
                textBoxPW.ReadOnly = false;
       }
}
 

위와 같은식으로 로그인을 실행하면 된다.

위에 예시에서는 시놀로지라는 nas의 마리아10 패키지를 사용한 db랑 연동한 코드이다. 실제 테스트까지 된 코드로서 포트번호와 서버 아이디 비밀번호 등은 자신이 마리아 데이터베이스에서 자신이 설정한 값과 일치하게 바꿔주고 하면 된다.

 

호스트에 있는 값에서는 위에 처럼 ddns로 서버주소가 포팅되어 있으면 서버주소를 넣고 아니라면 아이피주소 

ex) 123.234.124.123 이런식으로 아이피를 넣어도 된다.

위에 서버는 없는 주소이니 넣어도 안된다. 본인 서버 보호를 위해 임의적으로 그냥 넣었다.

 

나머지 코드등에서는 연결시도 중에 또 연결시도 하지 않도록 버튼을 비활성화 시키고 텍스트박스에 입력받은값들이 중간에 변경안되도록 수정못하게 하는것들이다.

 

로그인이 완료되면 로그인된 아이디를 메인폼에 넘겨주기 위해 그냥 시스템 프로퍼티에 넘겨주고

 

연결된 커넥션에 대한 정보는 델리게이트도 전송해주는 부분도 있다. 이건 로그인창을 다른폼에서 실행하므로 처리하는 부분이다.

 

시스템 프로퍼티에 설정하는거야 

위에 처럼 솔루션 탐색기에서 Settings.settings파일에서 등록해주면 되고.

 

로그인 커넥션을 델리게이트로 선언해서 넘겨주기 위해서는 아래와 같이 코드에서 선언해주면 된다.

 

MySqlConnection conn;

public MySqlConnection pasvalue
{
      get { return this.conn; }
      set { this.conn = value; }
}
 

위와 같은 식으로 선언해 놓으면 이제 메인폼에서 

로그인폼을 띄우고 로그인이 정상적으로 완료되면 로그인창에 사라지면서 메인폼이 나타나게 되고

연결 커넥션과 아이디등을 받아오기만 하는데 아래와 같이 코딩하면 된다.

메인폼 로드이벤트에서

 

private void MainForm_Load(object sender, EventArgs e)
{   
       loginStart();   
}
private void loginStart() 
{
     this.Opacity = 0; //투명도를 조정해서 메인폼이 사라자는것처럼 보이게함
     loginForm lg = new loginForm();
     lg.FormClosing += new FormClosingEventHandler(Closecheck);
     //로그인폼을 그냥 꺼버릴때 메인폼도 꺼지게해야 나중에 멍때리지 않음.
     if (lg.ShowDialog() == DialogResult.OK)
     {
            conn = lg.pasvalue;
            this.Text = "로그인: " + Properties.Settings.Default.username;
            this.Opacity = 100; //정상적으로 로그인되면 메인폼이 나타나게 함
      }
}
private void Closecheck(object sender,FormClosingEventArgs e) 
{
     if (Properties.Settings.Default.username.Equals(""))
     {
           Application.Exit();
     }    
}
 

이처럼 해놓으면 이제 로그인되고 마리아db(mysql디비)와 본격적으로 연동될 준비가 됐다.

 

이제 실제 쿼리를 텍스트 문으로 줘서 데이터베이스에 저장하거나 찾거나 가져오거나 할때 쓰는데 이게

 

c# 프로그래밍에서는 mysqlcommand다 이건 마리아db나 mysql동일하다.

 

insert(삽입하기)는 각각의 컬럼값을 지정해서 넣을수 있는데 물론 업데이트문도 마찬가지다 아래와 같이 하면 된다.

 

insert(삽입하기)

 

private void inseruserdb(string id,string ssno)
{
    try
    {
        using (MySqlCommand cmd = new MySqlCommand("insert into user(id,ssno) VALUES(?id,?ssno)", conn))
        {
            cmd.Parameters.Add("?id", MySqlDbType.VarChar).Value = id;
            cmd.Parameters.Add("?ssno", MySqlDbType.VarChar).Value = ssno;
            if (!(cmd.ExecuteNonQuery() > 0))
            {
                MessageBox.Show("INSERT QUERY ERROR");
            }


        }
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
 

위에 코드에서 보이는 것처럼 데이터타입을 꼭 디비랑 일치 시켜야된다 디비와 다른 데이터타입으로 삽입하게 되면

 

에러를 발생하게 된다.

 

검색(select)

private void buttonUser_Click(object sender, EventArgs e)
{
    tabControl1.SelectedTab = tabPageUser;
    dataGridView1.Columns.Clear();
          
    dataGridView1.DataSource = selectuserdb("*");

    dataGridView1.Columns[0].HeaderText = "사번";
    dataGridView1.Columns[1].HeaderText = "등록번호";


}
private DataTable selectuserdb(string condi)
{
    string CommandText = "SELECT " + condi + "FROM user";
    DataTable ds = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter(CommandText, conn);
    MySqlCommandBuilder builder = new MySqlCommandBuilder(da);
    da.Fill(ds);

    return ds;
}
 

위에 보이는것처럼 디비에 있는 내용을 검색해서 윈폼에 있는 데이터 그리드뷰에 데이터테이블 형식으로 삽입해서 보여주게 하였다. 이러면 마치 엑셀처럼 줄 이 생기면서 각 행렬마다 들어가게 된다.

이때 commandText에 쿼리를 짜는것에 따라 내가 원하는 정보를 얻을 수 있게 되는것이다.

 

예를 들면 특정 조건에 따라 보이고 싶으면 select문 뒤에 where이라는 조건문을 주어서 검색할수있는데

 

"SELECT [PLANDATE],[ProdID],[Serial],[PartNumber],[PlateItem],[PlateAddInfo],[LotID],[PrintChk] FROM[ezmes].[DM_NamePlatePrint_V] where PLANDATE between @date1 and @date2 and PRINTCHK IS NULL"

 

위와 같은 식으로 쿼리문을 짜게 되면 그 쿼리문의 결과에 따라 나타나게 된다

 

이제 다음과 같이 c# 프로그래밍을 하게 되면 마리아 데이터베이스와 mysql데이터베이스와의 완벽한 연동이 가능하다

 

응용은 이제 쿼리짜는것과 어떻게 컴포넌트들을 세팅하고 사용하는지에 따라 달려있다.

 

전체 컬럼 조회

SELECT * FROM 테이블;

 

일부 컬럼 조회

SELECT 컬럼1 [, 컬럼2, 컬럼3 ...] FROM 테이블;

 

컬럼에 별칭을 설정하여 조회

SELECT 컬럼1 AS 컬럼1별칭 [, 컬럼2 AS 컬럼2별칭, 컬럼3 AS 컬럼3별칭 ...] FROM 테이블;

 

특정 조건에 만족하는 데이터 조회

SELECT 컬럼1 [, 컬럼2, 컬럼3 ...] FROM 테이블 WHERE 조건식;

 

자세한 쿼리들은 데이터베이스 쪽을 참고하세요.

 

 

 

반응형