* 개발환경
개발 툴 : Visual Studio 15.0 (2017)
개발 언어 : C#
데이터베이스 : MySQL 5.7

* 데이터베이스 테이블
Table 1 : User - Num(PK), ID, PW, Manager
Table 2 : Data - Code, Date, User(FK)

* 기능
- 데이터 추가, 삭제, 수정, 검색(JDBC를 통한 Java-MySQL Database연동)
- 사용자 추가, 삭제, 목록(DB연동)
- 파일 입출력(Local)

* 주요 소스코드
- 기본 설명은 주석으로 처리했습니다.

1) 로그인
private void button_Login_Click(object sender, EventArgs e) { 
            String id = textBox4.Text; 
            String password = textBox3.Text; 
 // 입력받은 ID와 PASSWORD를 변수에 저장 
            int logInCheck = 0; 
            scon = new MySqlConnection(url); 
            scom = new MySqlCommand(); 
            scom.Connection = scon; 
 // SELECT 쿼리문(입력받은 ID,PASSWORD를 DB내에서 검색) 
            scom.CommandText = "SELECT * FROM user"; 
            try   { 
                scon.Open(); 
                sdr = scom.ExecuteReader(); 
                while (sdr.Read())   { 
                    String getId = sdr["id"].ToString(); 
                    String getPassword = sdr["password"].ToString(); 
                    String getManager = sdr["manager"].ToString(); 
 // 입력한 ID와 PASSWORD가 일치하는 내용이 있을 때 
                    if (id.Equals(getId) && password.Equals(getPassword))   { 
                        if (getManager.Equals("True")) 
   {   // 관리자가 로그인 할 경우
                            MessageBox.Show("[관리자] " + id + " 님 환영합니다.", "로그인 성공"); 
                        } 
                        else  

                        { // 사용자가 로그인 할 경우 
                            MessageBox.Show("[사용자] " + id + " 님 환영합니다.", "로그인 성공"); 
                        } 
                        logInCheck = 1; 
                        nowId = id; 
                       
 // 저장 경로 설정 
                        saveFolder = @"D:\BarcodeDataManager\" + textBox4.Text + @"\" 
                                     + nowTime.Split('.')[0] + @"년\" + nowTime.Split('.')[1] + @"월\"; 
                        saveRoute = saveFolder + nowTime.Split('.')[2].Split(' ')[0] + "일.txt"; 
                        textBox2.Text = saveRoute; 
                        dataGridView1.Columns[0].HeaderText = "시간"; 
                        dataGridView1.Columns[1].HeaderText = "바코드"; 
                        break; 
                    } 
                } 
                if (logInCheck != 1) 
// 입력받은 ID와 PASSWORD가 일치하지 않는 경우 
                { 
                    MessageBox.Show("ID 또는 PASSWORD를 확인해주세요", "로그인 실패"); 
                    textBox3.Clear(); 
                    textBox4.Clear(); 
                    textBox4.Focus(); 
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show(ex.Message, "오류발생!"); 
            } 
            finally 
            { 
                scon.Close(); 
                textBox1.Focus(); 
            } 
 }

2) 바코드 입력
private void textBox_Barcode_KeyUp(object sender, KeyEventArgs e)   { 
            
// 엔터키 입력 시 
            if (e.KeyCode == Keys.Enter) 
            { 
                
// 입력 란이 비어있을 경우 
                if (textBox1.Text.Equals("")) 
                { 
                  
  // 함수 종료 
                    return; 
                } 
                String barcode = textBox1.Text; 
                textBox1.Text = ""; 
               
 // Database 내 중복검사 함수 호출 
                if (isOverlap(barcode)) 
                { 
                    
// Database 내 데이터 입력 함수 호출 
                    insertDatabase(barcode); 
                  
  // 로컬 컴퓨터 내 txt파일 저장 
                    dataFileWriter(barcode); 
                    if (checkBox1.Checked) // 기록여부 체크박스 확인 
                    { 
                        String[] Row = { nowTime, barcode }; 
                        dataGridView1.Rows.Add(Row); 
                        dataGridView1.FirstDisplayedScrollingRowIndex = 
                        dataGridView1.Rows.Count - 1;
 // DataGridView 자동 스크롤 
                    } 
                } 
                
// Data 중복 시 
                else 
                { 
                   
 // 함수 종료 
                    return; 
                } 
            } 
}


3) 데이터 추가(관리자용)
private void button_Data_Insert_Click(object sender, EventArgs e)  { 
            String barcode = textBox1.Text; 
            if(barcode.Equals("")) 
            { 
                MessageBox.Show("입력을 확인해주세요"); 
                return; 
            } 
            String time; 
            String user; 
           
 // 현재 시간 사용 체크 시 
            if(checkBox1.Checked) 
            { 
                time = Form1.nowTime; 
            } 
            
// 아닐 시 입력된 dateTimePicker에서 값을 받아온다. 
            else 
            { 
                time = dateTimePicker1.Value.ToString("yyyy.MM.dd HH:mm:ss"); 
            } 
            
// 현재 사용자 사용 체크시 
            if(checkBox2.Checked) 
            { 
                user = Form1.GetId(); 
            } 
           
 // 아닐 시 입력된 콤보박스에서 값을 받아온다. 
            else 
            { 
                user = comboBox1.SelectedItem.ToString(); 
            } 
            
// 데이터 중복 확인 
            if(Form1.isOverlap(barcode)) 
            { 
                Form1.scon = new MySqlConnection(Form1.url); 
                Form1.scom = new MySqlCommand(); 
                Form1.scom.Connection = Form1.scon; 
               
 // INSERT 쿼리문 
                Form1.scom.CommandText = "INSERT INTO datalist (code, serial, user) VALUES ('" 
                    + barcode + "','" + time + "','" + user + "');"; 
                try 
                { 
                    Form1.scon.Open(); 
                    Form1.sdr = Form1.scom.ExecuteReader(); 
                    MessageBox.Show("데이터가 입력되었습니다."); 
                } 
                catch (Exception ex) 
                { 
                    MessageBox.Show(ex.Message); 
                } 
                finally 
                { 
                    Form1.scon.Close(); 
                    this.Close(); 
                } 
            } 
            
// 데이터 중복 시 
            else 
            { 
               
 // 함수 종료 
                textBox1.Focus(); 
                return; 
            } 
 }


4) 데이터 중복검사
public static bool isOverlap(String inputBarcode)   { 
            scon = new MySqlConnection(url); 
            scom = new MySqlCommand(); 
            scom.Connection = scon; 
           
 // SELECT 쿼리문(입력받은 Barcode를 DB내에서 검색) 
            scom.CommandText = "SELECT * FROM datalist"; 
            try 
            { 
                scon.Open(); 
                sdr = scom.ExecuteReader(); 
                while (sdr.Read()) 
                { 
                    String getSerial = sdr["serial"].ToString(); 
                    String getCode = sdr["code"].ToString(); 
                    if (inputBarcode.Equals(getCode)) 
                    { 
                        MessageBox.Show("[ " + getSerial + " ] " + inputBarcode + 
                                        "은 이미 중복되었습니다.", "데이터 중복"); 
                        return false; 
                    } 
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show(ex.Message, "오류발생!"); 
            } 
            finally 
            { 
                scon.Close(); 
            } 
            return true; 
 }


5) 파일쓰기(로컬 컴퓨터에 따로 저장)
 private void dataFileWriter(String barcode) { 
            if(checkBox2.Checked == true) 
// 저장 여부 체크박스 확인 
            { 
                DirectoryInfo di = new DirectoryInfo(saveFolder); 
                if (di.Exists == false)
 // 지정된 경로에 폴더가 있는 지 확인 
                { 
                    di.Create(); 
// 폴더 생성 
                } 
                
// 파일쓰기 (true 옵션 : 파일 맨 끝에 덧붙여 쓰기) 
                using (StreamWriter outputFile = new StreamWriter(saveRoute, true)) 
                { 
                    outputFile.WriteLine("[" + nowTime + "] " + barcode); 
                } 
            }   
}

* 실행화면


- 화면구성 
기록 란 리스트 ) DataGridView
* 다음 함수를 통해 DataGridView PostHeader에 index를 추가
        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
        { 
            if (e.RowIndex >= 0) 
            { 
                string NumberingText = (e.RowIndex + 1).ToString(); 

               
 // 글자 사이즈 구하기. 
                SizeF stringSize = e.Graphics.MeasureString(NumberingText, Font); 

               
 // 글자에 맞춰 좌표계산.  
                PointF StringPoint = new PointF 
                ( 
                    Convert.ToSingle(dataGridView1.RowHeadersWidth - 3 - stringSize.Width), 
                    Convert.ToSingle(e.RowBounds.Y) + dataGridView1[0, e.RowIndex].ContentBounds.Height * 0.3f 
                ); 

                
// 문자열 그리기. 
                e.Graphics.DrawString 
                ( 
                    NumberingText, 
                    Font, 
                    Brushes.Black, 
                    StringPoint.X, 
                    StringPoint.Y 
                ); 
            } 
        }

바코드 입력 란) TextBox - USB를 통해 바코드 입력 시 바코드 입력 후 자동 Enter키 입력
현재시간) Label - 쓰레드를 통해 1초마다 현재시간 갱신(바코드 입력 시간 저장)

** 바코드 입력 란은 항상 포커스가 유지되어야 하기 때문에 쓰레드 또는 버튼 이벤트에 포커스를 유지하는 함수를 호출 해 주어야 합니다 **

질문 사항은 댓글로 남겨주세요






[C# DLL 파일 생성 및 C++ 연동법 ]

1. C#에서 DLL파일 생성 

0) VS 관리자 권한으로 실행! 
1) 새 프로젝트 - 클래스 라이브러리(.NET Framework) 
2) using System.Runtime.InteropServices; 코드 추가 
3) 프로젝트 우클릭 - 속성 - 응용프로그램 - 어셈블리 정보 - 어셈블리를 COM에 노출 체크 
4) 빌드 - COM interop 등록 체크 
5) 도구 - GUID 만들기 - 5번 항목 복사 
6) 클래스 위에 GUI 붙여넣기 
7) Class를 Interface로 변경 
8) Interface에 메소드 선언 
9) 아래(같은 레벨)에 Interface를 상속받은 클래스 선언(사용될 클래스) 
10) 쓰레드 사용시 반드시 static으로 선언 
11) C# 코드 빌드 
12) 프로젝트 내 \bin\debug\'프로젝트명'.dll 생성 확인 
13) VS 개발자 명령 프롬프트 관리자 권한으로 실행! 
14) 디렉토리를 프로젝트\bin\debug\로 변경 
15) regasm '파일이름'.dll /tlb:'파일이름'.tlb 실행 

2. C++에서 C# DLL파일 사용 

0) VS 관리자 권한으로 실행! 
1) include 밑에 #import "파일이름.tlb" no_namespace named_guids 추가 
2) 'C#클래스명' *'객체이름' = NULL; 
3) CoInitialize(NULL); 
4) HRESULT hr = CoCreateInstance(CLSID_'인터페이스명', NULL, CLSCTX_INPROC_SERVER, IID_'클래스명', reinterpret_cast<void**>(&'객체이름')); 
5) if (SUCCEEDED(hr)) 후 '객체이름'->'메소드명' 으로 사용

'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C언어 포인터  (8) 2018.09.25
C++ 자바 상속 비교  (0) 2018.09.08
C 랜덤 - 난수 생성하기  (7) 2018.09.06
C++ String 문자열 사용법 정리  (0) 2018.08.20


Python에서 MySQL DB를 사용하기 위해서는 PyMySQL을 설치해야 합니다.


PyMySQL은 다음 공식 사이트에서 다운로드 가능합니다.
https://github.com/PyMySQL/PyMySQL

* 설치방법
1. CMD창을 관리자 권한으로 실행
2. Python이 설치된 폴더 하위 폴더 Scripts로 이동
ex) cd C:\Users\user\AppData\Local\Programs\Python\Python36-32\Scripts
3. 다음 명령어 실행 
pip install pymysql
4. Successfully installed pymysql-0.7.9 이 출력되면 설치 완료

* 설치환경
1. 파이썬 : Python 3.6
2. 파이썬 개발 툴 : PyCharm Community Edition 2018.1.4
3. 데이터베이스 :  MySQL 5.1.41-community


* 소스코드

import pymysql

conn = pymysql.connect(host 'localhost'user 'id'password 'password' ,db 'DB명')
# host = DB주소(localhost 또는 ip주소), user = DB id, password = DB password, db = DB명
curs = conn.cursor()

sql = "SELECT * FROM TABLE명" # 실행 할 쿼리문 입력
curs.execute(sql) # 쿼리문 실행

rows = curs.fetchall() # 데이터 패치

for in rows :
     print(i)

conn.close()

쿼리문과 for문에서 데이터를 적절히 처리해서 필요한 프로그램에 사용하면 됩니다.
오류나 질문사항은 댓글로 달아주세요.



to Top