IT정보공유/C#

[c#] SqlDependency를 이용한 MSSQL 데이터 상태 변화 감지 간단 샘플(Service Broker)

알지오™ 2019. 5. 10.

MSSQL Sevice Broker 라고 하는 대규모 분산 어플리케이션 개발을 위한 메시지 기반 매커니즘을 제공하고 있습니다.

간단하게 얘기하면, DB에 변화가 생겼을 경우 이를 어플리케이션에게 알려줄수 있습니다.
서비스 브로커에 대한 보다 전문적인 내용을 알고 싶으신 분들은 검색을 해보시고, 
제 블로그에서는 C#을 이용한 MSSQL Sevice Broker를 응용프로그램에 어떻게 갖다 붙여넣어
프로그래밍을 하는지 샘플을 보여드릴겁니다.

우선은 MSSQL Server Management Studio를 이용해 Service Broker를 활성화 시켜줍니다.
(기본으로 활성화 되있는거 같긴한데.ㅋ)

 

DB의 Service Broker 설정을 완료했다면 다음으로 넘어가서 
C#에서는 SqlDependency 라는 클래스를 이용하여 MSSQL Server와 연결하며
DB의 상태 변화를 감지할 수 있게 됩니다.

아래의 소스코드는 말그대로, 그냥 맛뵈기 정도입니다.
TestTable의 필드3개를 감시하는 용도입니다.
아주 단순한 소스 이므로, 참고만 하시기 바랍니다. 
(방금 만들어서 테스트 하고 블로그에 포스팅하는 중입니다 ㅋ)

 

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

namespace SqlDependencyTest
{
    public partial class Form1 : Form
    {
        SqlDependency sd;        
        SqlConnection scon;
        
        public Form1()
        {
            InitializeComponent();

            string sconstring = "Data Source=127.0.0.1,1433;Initial Catalog=DBMASTER;User ID=dbuser;Password=dbPw;";
            scon = new SqlConnection(sconstring);
            scon.Open();
		    SqlDependency.Start(sconstring);            
        }

        public void GetLastDBState()
        {
            SqlCommand sc = new SqlCommand(@"select [Field1], [Field2], [Field3] from dbo.TestTable", scon);
            sd = new SqlDependency(sc);

            sd.OnChange += Sd_OnChange;
            SqlDataReader rdr = sc.ExecuteReader();
            rdr.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GetLastDBState();
        }

        private void Sd_OnChange(object sender, SqlNotificationEventArgs e)
        {
            string sLog = string.Format("Type:{0} / Info:{1} / Source:{2}", e.Type.ToString(), e.Info.ToString(), e.Source.ToString());
            Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + sLog);
            GetLastDBState();
        }
		
		private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            SqlDependency.Stop(sconstring);
        }
    }
}

        

 


출력 결과물
2019-05-10 16:30:51 Type:Change / Info:Update / Source:Data
2019-05-10 16:30:52 Type:Change / Info:Update / Source:Data
2019-05-10 16:30:53 Type:Change / Info:Update / Source:Data


GetLastDBState() 함수같은 곳에 그리드에 데이터를 바인딩 한다던지
UI에 갱신을 표시하는 로직을 넣어도 될것 같네요.

자세히 보지는 않았지만 상태변화는 알수 있고, 어떤 데이터가 변했는지는 알수 없는것 같은데
그럴때는 트리거를 이용해서 좀더 고도화를 해야 하는것 같습니다만, 시간을 많이 투자할 필요가 별로 없어서 이쯤에서 그만. ㅋ

 

♡ 여러분의 공감이 빅에너지에게 에너지원입니다. 공감, 좋아요 부탁합니다~ 

댓글

💲 추천 글