C#/Database

C# WinForm, DB MSSQL 연동해서 실시간 데이터 끌고와서 메모장으로 옮기기

기하 2021. 8. 30. 02:03

구현기능

1. WinForm, DB 연동(연결)

2. 실시간으로 업데이트 되는 데이터 끌고오기(필요한 데이터)

3. 데이터를 메모장으로 옮겨 저장하기

 

사전조사 : 끌고올 테이블 정보

 

 

여기서 INPUT_DATE 라는 놈과, EN_ELE 라는 놈의 데이터만 가지고 오고 싶음

 

 

 

 

시작 

0. todo :

   먼저... DB값이 언제들어올지 모른다는 가정하에....

   윈폼은 while 상태로 늘 대기중이여야 할것 같음.

   폼이 while로 묶여있으면 굳어버리니까 thread를 써야할꺼 같고 다음은

   가져온 데이터와, 디비에 있는 데이터가 같은지 안같은지 비교하고

   같지 않다면 그건 최신데이터라는 얘기니까 들고와서

   listBox에 뿌려주고, 동시에 txt파일로 만들 예정임

   아! 쓰레드 종료 및 프로그램 종료는 그냥 x 표 눌러야 함 

 

 

1. 윈폼프로젝트 만들고 ListBox, Button컨트롤 배치

 

 

2. 아 일단 퇴근하고 디아블로해야지 ㅎㅎ

까먹기전에 올려서 기록할꺼임!

 

 

3. TODO 적기

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;
 
namespace RealtimeStealData
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // 뭔가 초기화 해줄것들은 여기에
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 디비 해제
            // 입출력 관련 스트림 클로즈
            // 쓰레드 확인사살
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            // 디비 접속
            // 입출력 관련 스트림 오픈
            // 쓰레드 시작
        }
 
        private void Thread_Work()
        {
            // while(true)
            // 디비에서 읽어오고
            // 리스트박스 내용과 비교하고
            // 리스트박스에 내용 뿌리고
            // 텍스트박스에 내용 저장하고
        }
    }
}

 

 

4. 코드 적어보기

내일은 꼭 완성해야지 ㅎㅎ

 

 

5. 코드 적어보기

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace RealtimeStealData
{
    public partial class Form1 : Form
    {
        SqlConnection conn;
        SqlCommand cmd;
        SqlDataReader dr;
 
        FileStream fs;
        StreamWriter sw;
 
        Thread myThread;
        bool myThread_run;
 
        string listBoxStr;
        bool runFirst;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // 뭔가 초기화 해줄것들은 여기에
            myThread_run = true;
            runFirst = true;
            listBoxStr = "";
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                // 입출력 관련 스트림 클로즈
                sw.Close();
                fs.Close();
 
                // 디비 해제
                dr.Close();
                cmd = null;
                conn.Close();
                
                // 쓰레드 확인사살
                myThread_run = false;
                myThread.Abort();
                myThread = null;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Visible = false;
            try
            {
                // 디비 접속
                conn = new SqlConnection("server=접속정보적으삼;database=적으삼;uid=적으삼;pwd=적으삼삼맨");
                conn.Open();
                cmd = new SqlCommand();
                cmd.Connection = conn;
 
                // 입출력 관련 스트림 오픈
                fs = new FileStream("저장경로 적으삼삼맨", FileMode.Append, FileAccess.Write);
                sw = new StreamWriter(fs);
 
                // 쓰레드 시작
                myThread = new Thread(Thread_Work);
                myThread.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
 
        private void Thread_Work()
        {
            while (myThread_run)
            {
                // 디비에서 읽어오고
                string Query = "SELECT TOP(1) INPUT_DATE, EN_ELE FROM 테이블명적으삼맨 ORDER BY LOGD_INDEX DESC;";
                cmd.CommandText = Query;
                dr = cmd.ExecuteReader();
 
                while (dr.Read())
                {
                    string input_date = dr["INPUT_DATE"].ToString();
                    string en_ele = dr["EN_ELE"].ToString();
                    string resultStr = input_date + "\t" + en_ele;
 
                    // 리스트박스 내용과 비교하고
                    try
                    {
                        // 일단 처음값을 뿌려줘야 하니까...
                        if (runFirst)
                        {
                            // 윈폼 크로스 쓰레딩? 해제
                            listBox1.Invoke((MethodInvoker)(() => listBox1.Items.Insert(0, resultStr)));
                            sw.WriteLine(resultStr);
                            listBoxStr = resultStr;
                            runFirst = false;
                        }
 
                        if (!listBox1.Items[0].ToString().Equals(resultStr))
                        {
                            // 여기로 와지면, 다른 내용이란 거니까... 최신 정보란 잼
 
                            // 리스트박스에 내용 뿌리고
                            listBox1.Invoke((MethodInvoker)(() => listBox1.Items.Insert(0, resultStr)));
 
                            // 텍스트박스에 내용 저장하고
                            sw.WriteLine(resultStr);
 
                            // 비교할 문자열을 갱신시켜쥼
                            listBoxStr = resultStr;
                        }  
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message.ToString());
                    }
                                       
                }
                dr.Close();
            }            
        }// Thread_Work()
    }
}

 

이러케 눈에 피나는 코드가 완성됐으며

테스트 해보니 됨 ㅎㅎㅎㅎㅎㅎ

종료단추 눌러도 종료가 안되네 ㅋ

종료버튼 만들어서 쓰레드 따로 멈쳐줘야할듯

 

[출처] https://m.blog.naver.com/parkdex/221139912910