반응형

이번 포트팅은 C# MSSQL 만든 ERP에서 MES Mysql 연동하는 방법에 대해 포스팅 해보록 하겠습니다ERP개발을 하다보면 정부의 스마트공장 사업으로 인해 고도화 부분에서 MES 장비 연동개발건이 종종들어옵니다.  대부분 MES업체들은 장비에서 나오는 시그널을 Mysql 데이터베이스에 저장하고 있습니다. 이미 연륜이 쌓이신 개발자들은 아시는 내용이겠지만 C# 경력이 적은 개발자들을 위해 경험을 공유해보도록 하겠습니다.

 

 

요즘 신입 개발자들 중에 .NET개발자들이 적습니다. 다들 웹쪽이나 앱개발쪽으로 많이들 하는것 같습니다. 그리고 .NET개발을 한다 하더라도 이미 만들어 놓은 제품을 유지보수하는 경우가 많죠. 그렇기에 가장 기초적인 데이터베이스 연결 부분등 기초적인 코어부분을 접해본 경험이 적을겁니다.

 

코어부분을 공부하시고 싶으신 개발자분들은 Google 검색창 microsoft enterprise library 라고 검색하시면 MS에서 작성해놓은 Core Framework를 다운받으실 수 있습니다.

 

1. Mysql .Net Connector 버전 확인

Mysql 과 연동하려면 .NET Frmaework 버전을 확인하여 환경에 맞는 Mysql 버전을 설치해야합니다.

https://dev.mysql.com/doc/connector-net/en/connector-net-versions.html

 

MySQL :: MySQL Connector/NET Developer Guide :: 2 Connector/NET Versions

MySQL Connector/NET Developer Guide  /  Connector/NET Versions Chapter 2 Connector/NET Versions There are two Connector/NET release series described in this guide: MySQL Connector/NET 8.0 is a continuation of Connector/NET 7.0, but now named to synchroni

dev.mysql.com

 

2. Mysql Connector 다운로드

아래의 사이트 주소로 들어가 위에서 확인하신 버전의 Mysql을 다운로드 합니다.

https://downloads.mysql.com/archives/c-net/

 

MySQL :: Download MySQL Connector/NET (Archived Versions)

Please note that these are old versions. New releases will have recent bug fixes and features! To download the latest release of MySQL Connector/NET, please visit MySQL Downloads. MySQL open source software is provided under the GPL License.

downloads.mysql.com

 

3. MySql.Data.dll 파일을 사용하실 프로젝트에 참조

다운받아 MySql을 설치한 경로로 들어가면 MySql.Data.dll 파일을 사용하실 프로젝트에 참조합니다.

여기서 아니 왜 NuGet 패키지에서 다운받아 참조하면 될걸 왜 저렇게 번거롭게 작업을 해야해? 라고 생각하시는 분들도 계실거라 생각합니다. 간단한 프로젝트나 아니면 신생회사에서는 Visual Studio 상위버전이나 .NET Framework를 상위버전을 사용하실 겁니다. 하지만 이미 제품이 만들어졌거나 ERP처럼 덩치가 큰 프로그램 같은 경우 상위버전으로 올리기가 쉽지 않습니다. 그래서 위의 작업처럼 번거러운 작업을 해줘야 합니다.

 

4. 연결 도움창 작성

저는 연결할 프로젝트에 아래와 같은 연결 도움창을 만들었습니다.

 

5. MySql 네임스페이스 참조 및 변수선언

using MySql.Data.MySqlClient;

개발화면에 맞춰 변수를 선언해줍니다.

#region -> 일반변수선언
 
private string _HostName = "";    //서버연결방식 도메인
private string _ServerName = "";  //서버연결방식 아이피
private string _CONNECT = "";    //도메인인지 아이피인지 여부
private string _ID = "";              //로그인아이디
private string _PWD = "";          //패스워드
private string _PORT = "";          //포트
private string _DATABASE = "";   //데이터베이스명
 
private bool isTested = false;     //저장전 연결여부 테스트 여부
 
private string Path = "";  //Mysql 서버정보가 저장될 xml경로
 
#endregion

 

6. 연결테스트 버튼 코딩

연결테스트 버튼 클릭에 대한 내용을 코딩해 줍니다. 아래의 소스에서 색깔이 칠해진 부분을 이용하여 해당 서버에 접근하여 데이터를 처리할 수 있습니다. 해당부분을 참고하여 다른 프로젝트에서 데이터 연동을 하시기 바랍니다.

//연결테스트 버튼 클릭
private void btn_TEST_Click(object sender, EventArgs e)
 {
       if (this.txt_SERVER.Text == "")
       {
            MessageBox.Show("DataBase Server를 입력해 주십시오.");
            this.txt_SERVER.Focus();
            return;
       }
 
       if (this.txt_PORT.Text == "")
       {
            MessageBox.Show("Port번호를 입력해 주십시오.");
            this.txt_PORT.Focus();
            return;
       }
 
       if (this.txt_DATABASE.Text == "")
       {
            MessageBox.Show("Database를 입력해 주십시오.");
            this.txt_DATABASE.Focus();
            return;
       }
 
      if (this.txt_ID.Text == ""))
      {
            MessageBox.Show("ID를 입력해 주십시오.");
            this.txt_ID.Focus();
            return;
       }
 
       if (this.txt_PWD.Text == "")
       {
            MessageBox.Show("Password를 입력해 주십시오.");
            this.txt_PWD.Focus();
            return;
       }
 
       _HostName = this.txt_SERVER.Text;
       _ServerName = this.txt_SERVER.Text;
       _PORT = this.txt_PORT.Text;
       _DATABASE = this.txt_DATABASE.Text;
       _ID = this.txt_ID.Text;
       _PWD = this.txt_PWD.Text;
 
       this.DBConnectTest(_HostName, _PORT, _DATABASE, _ID, _PWD);
}

//DBConnectTest 메소드
private void DBConnectTest(string hostname, string port, string database, string id, string pwd)
{
       DataSet dsAll = new DataSet();
       DataSet ds = new DataSet();

       //연결을 아이피로 할것인지 도메인으로 할것인지 여부를 체크하여 서버네임을 가져온다.       
      if (this.chk_CONNECT.Checked == true)
       {
            _ServerName = hostname;
       }
       else
       {
            IPHostEntry hostEntry = Dns.GetHostEntry(hostname);
            foreach (IPAddress ip in hostEntry.AddressList)
            {
                 Console.WriteLine(ip);
                 _ServerName = ip.ToString();
            }
       }

       _PORT = port;
       _DATABASE = database;
       _ID = id;
       _PWD = pwd;

      StringBuilder _strArg = new StringBuilder("");
      _strArg.Append("Server = ");           // SQL
      _strArg.Append(_ServerName);        // 서버
      _strArg.Append(";Port = ");
      _strArg.Append(_PORT);                 // 포트
      _strArg.Append(";Database = ");
      _strArg.Append(_DATABASE);          // 데이터베이스
      _strArg.Append(";Uid = ");
      _strArg.Append(_ID);                     // ID
      _strArg.Append(";Pwd = ");
      _strArg.Append(_PWD);                 // PWD
      _strArg.Append(";");

      MySqlConnection conn = new MySqlConnection(_strArg.ToString());

      try
      {
           conn.Open();
           MessageBox.Show("DB 접속이 가능합니다.");

           ////MES 데이터베이스에서 데이터를 가져온다.
           //MySqlCommand cmd = conn.CreateCommand();
           //string sql = "SELECT * FROM 테이블명";
           //cmd.CommandText = sql;
           //MySqlDataAdapter adp = new MySqlDataAdapter(cmd);
           //adp.Fill(ds, "t_category");

           //테스트 여부를 true로 변경한다.
           isTested = true;
      }
      catch (Exception Ex)
      {
            conn.Close();
            MessageBox.Show("DB 접속이 불가능합니다.");
            isTested = false;
       }
       finally
       {
            conn.Close();
       }
}

 

7. 데이터베이스 연결정보 저장 코딩

데이터베이스 연결정보 저장에 대한 내용을 코딩해줍니다. 암호화 부분은 여러분들의 상황에 맞게 작성하시기 바랍니다.

//DB연결정보 XML저장
private void btn_getInfo_Click(object sender, EventArgs e)
{
      try
      {
           if (!isTested)
           {
                   MessageBox.Show("데이터베이스 연결테스트를 먼저 실행해주세요.");
                    return;
           }
 
           if (this.chk_CONNECT.Checked == true)
           {
                    _CONNECT = "1";
           }
 
           FileStream fs = new FileStream(Path, System.IO.FileMode.Create);
           XmlTextWriter XTW = new XmlTextWriter(fs, System.Text.Encoding.Unicode);
           XTW.Formatting = System.Xml.Formatting.Indented;        //들여쓰기
 
           XTW.WriteStartDocument();
           XTW.WriteStartElement("Config");
 
           XTW.WriteElementString("Server", _HostName);
           XTW.WriteElementString("CONNECT", _CONNECT);
           XTW.WriteElementString("PORT", _PORT);
           XTW.WriteElementString("DATABASE", _DATABASE);
           XTW.WriteElementString("ID", _ID);
           XTW.WriteElementString("PWD", 암호화된 패스워드);
           XTW.WriteEndElement();
           XTW.WriteEndDocument();
 
           XTW.Close();
 
           MessageBox.Show("데이터베이스 정보가 저장되었습니다.");
      }
      catch (Exception Ex)
      {
           MessageBox.Show(Ex);
      }
}

 

8. 데이터베이스 정보 가져오기

해당 연결정보 창을 열때 서버정보를 XML에서 받아오는 부분을 코딩해 줍니다. 파일실행경로와 복호화 패스워드 부분은 여러분들의 상황에 맞게 작성하시기 바랍니다.

private void frmConnMes_Shown(object sender, EventArgs e)
{
      // xml을 받아와서 정보를 매칭시킨다.
      Path = 파일실행경로 + "DeviceSetting.xml";
      if (File.Exists(Path))
      {
           XmlDocument xDoc = new XmlDocument();
           xDoc.Load(Path);
 
           XmlNodeList XNL = xDoc.GetElementsByTagName("Config");
 
           this.txt_SERVER.Text = XNL[0]["Server"].InnerText;
 
           string strConnect = XNL[0]["CONNECT"].InnerText;
           if (strConnect == "1")
               this.chk_CONNECT.Checked = true;
           else
               this.chk_CONNECT.Checked = false;
 
           this.txt_PORT.Text = XNL[0]["PORT"].InnerText;
           this.txt_DATABASE.Text  = XNL[0]["DATABASE"].InnerText;
           this.txt_ID..Text  = XNL[0]["ID"].InnerText;
           this.txt_PWD.Text  = 복호화된 패스워드;
 
           _ServerName = this.txt_SERVER.Text;
           _PORT = this.txt_PORT.Text ;
           _DATABASE = this.txt_DATABASE.Text;
           _ID = this.txt_ID.Text;
           _PWD = this.txt_PWD.Text;
      }
}

 

9. 마무리

핵심사항은 모두 기술한것 같습니다. 나머지 부분은 위의 코딩 부분을 짜집기 하시면 연동 프로젝트를 완료하실수 있을것이라 생각합니다. 실제로 현업에서는 각자의 회사에서 User Control을 만들어 화면을 구성하고 이미 만들어놓은 메소드들을 사용하여 코딩합니다. 이렇게 작업을 하면 회사입장에서는 개발자가 이직을 해도 제품을 유지보수 하기 쉽지만 개발자 입장에서는 이직 시 매우 어려움을 겪습니다. 왜냐하면 이직한 회사에서는 해당 회사만의 User Control과 명칭이 틀린 메소드들을 구현해서 작업을 하고있을테니까요. 그렇기 때문에 개발자는 현실에 안주하지 말고 기본기를 갖추도록 노력하고 항상 자기개발에 힘써야 합니다. 

 

 

 

반응형

+ Recent posts