데이터 세트가 변경 될 때 SqlDependency가 OnChange 이벤트를 발생시키지 않습니다.

사이 옵티 카

저는 SQL Server를 사용하는 쿼리 알림 개념을 처음 접했으며이 개념을 둘러 보는 데 시간이 좀 걸릴 것입니다.

내 목표는 SQL Server 테이블이 변경 될 때 알림을받는 Windows 서비스 응용 프로그램을 만드는 것입니다. 시작하는 데 도움이되는 가이드를 따랐습니다 .

그러나 예상 한 결과를 얻을 수 없습니다. OnStart()내 Windows 서비스 앱 방법은 다음과 같습니다.

protected override void OnStart(string[] args)
{
        eventLog1.WriteEntry("Service Started");

        serviceRun = false;

        SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);

        try
        {
            perm.Demand();
            eventLog1.WriteEntry("permission granted");
        }
        catch (System.Exception)
        {
            eventLog1.WriteEntry("permission denied");
        }

        try
        {
            connstr = "Data Source=THSSERVER-LOCAL;Initial Catalog=ET;User ID=mujtaba;Password=ths123";

            connection = new SqlConnection(connstr);

            SqlCommand command = new SqlCommand("select * from dbo.Customer_FileUploads", connection);

            // Create a dependency and associate it with the SqlCommand.
            SqlDependency dependency = new SqlDependency(command);

            // Maintain the reference in a class member.
            // Subscribe to the SqlDependency event.
            dependency.OnChange += Dependency_OnChange;

            SqlDependency.Start(connstr);

            connection.Open();

            // Execute the command.
            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        //eventLog1.WriteEntry("reading data");
                    }
                }
                else
                {
                    eventLog1.WriteEntry("No rows found.");
                }
                reader.Close();
            }
        }
        catch (Exception e)
        {
            eventLog1.WriteEntry("Error Message: " + e.Message);
        }
}

이벤트 SqlDependency가 구독되었습니다. 다음과 같습니다.

private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    // Handle the event.
    eventLog1.WriteEntry("data changed");
}

OnStop()방법의 외모 때문에 좋아한다 :

protected override void OnStop()
{
        SqlDependency.Stop(connstr);
        connection.Close();
        eventLog1.WriteEntry("In onStop.");
}

나는 한 ENABLE_BROKER내 데이터베이스에서 true로 설정합니다. 최종 결과는 서비스가 실행되고 다음 로그가 생성됩니다.

"Service Started"
"permission granted"
"data changed"

그러나 테이블에 새 데이터를 삽입하면 OnChange()이벤트가 발생하지 않고 새 로그가 생성되지 않습니다. 또한 서비스를 중지했다 OnChange()다시 시작하면 새 데이터가 삽입되지 않은 경우에도이 트리거됩니다.

누구든지 프로세스를 이해하도록 도울 수 있습니까?

그리고 Guzman

SqlDependency는 이벤트 발생 후 제거되므로 종속성과 함께 명령을 다시 실행해야합니다. 다음은 알림이 오류로 인한 것이 아니라면 다시 구독하는 콘솔 앱 예제입니다.

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlDependencyExample
{
    class Program
    {

        static string connectionString = @"Data Source=.;Initial Catalog=YourDatabase;Application Name=SqlDependencyExample;Integrated Security=SSPI";

        static void Main(string[] args)
        {

            SqlDependency.Start(connectionString);

            getDataWithSqlDependency();

            Console.WriteLine("Waiting for data changes");
            Console.WriteLine("Press enter to quit");
            Console.ReadLine();

            SqlDependency.Stop(connectionString);

        }

        static DataTable getDataWithSqlDependency()
        {

            using (var connection = new SqlConnection(connectionString))
            using (var cmd = new SqlCommand("SELECT Col1, Col2, Col3 FROM dbo.MyTable;", connection))
            {

                var dt = new DataTable();

                // Create dependency for this command and add event handler
                var dependency = new SqlDependency(cmd);
                dependency.OnChange += new OnChangeEventHandler(onDependencyChange);

                // execute command to get data
                connection.Open();
                dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));

                return dt;

            }

        }

        // Handler method
        static void onDependencyChange(object sender,
           SqlNotificationEventArgs e)
        {

            Console.WriteLine($"OnChange Event fired. SqlNotificationEventArgs: Info={e.Info}, Source={e.Source}, Type={e.Type}.");

            if ((e.Info != SqlNotificationInfo.Invalid)
                && (e.Type != SqlNotificationType.Subscribe))
            {
                //resubscribe
                var dt = getDataWithSqlDependency();

                Console.WriteLine($"Data changed. {dt.Rows.Count} rows returned.");
            }
            else
            {
                Console.WriteLine("SqlDependency not restarted");
            }

        }


    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

SignalR에 대해 SqlDependency OnChange 이벤트가 발생하지 않음

분류에서Dev

ObservableCollection 개체가 변경 될 때 ListView가 업데이트되지 않습니다.

분류에서Dev

Polymer-페이지가 변경 될 때 분리 된 이벤트가 트리거되지 않습니다.

분류에서Dev

asp.net의 페이지에서 유효성 검사가 시작될 때 확인란 변경 이벤트가 발생하지 않습니까?

분류에서Dev

값이 범위에서 변경 될 때 Angular js ng-change 이벤트가 작동하지 않습니다.

분류에서Dev

Combobox는 기본 데이터가 수정 될 때 액션 이벤트를 발생시킵니다.

분류에서Dev

"PageTabViewStyle"이 포함 된 TabView는 @State var가 변경 될 때 콘텐츠를 업데이트하지 않습니다.

분류에서Dev

값이 변경 될 때 DataGrid 데이터 트리거가 실행되지 않음

분류에서Dev

내 onchange 이벤트가 트리거 될 때가 아니라 페이지로드시 발생하는 이유는 무엇입니까?

분류에서Dev

ItemsSource가 변경 될 때 DataGrid가 업데이트되지 않음

분류에서Dev

사용자를 수신하는 StreamProvider는 사용자가 변경 될 때 업데이트되지 않습니다.

분류에서Dev

Angular2 : 변수가 변경 될 때 뷰가 업데이트되지 않습니다.

분류에서Dev

UWP-이벤트에 의해 값이 변경 될 때마다 TextBlock.Text가 업데이트되지 않음

분류에서Dev

전역 ratom이 변경 될 때 로컬 시약 원자가 업데이트되지 않습니다.

분류에서Dev

컨트롤러가 변경 될 때보기 (템플릿)가 업데이트되지 않습니다.

분류에서Dev

datepicker-datepicker 객체를 통해 초기화 될 때 onSelect 이벤트가 발생하지 않습니다.

분류에서Dev

내 데이터가 변경 될 때 내 검색 파이프 필터가 내 템플릿을 업데이트하지 않습니다.

분류에서Dev

각도기-DOM 요소가 변경 될 때 페이지 개체가 업데이트되지 않습니다.

분류에서Dev

Heroku가 배포 한 Django 웹 페이지는 DB가 변경 될 때 업데이트되지 않습니다.

분류에서Dev

해시 위치가 변경 될 때 이벤트를 트리거하는 방법

분류에서Dev

Ember, #if item.value inside #each, 값이 변경 될 때 페이지가 업데이트되지 않았습니다.

분류에서Dev

TComboBox의 ITEMINDEX를 변경해도 OnChange 이벤트가 트리거되지 않습니다.

분류에서Dev

ng-disable은 표현식에 사용 된 변수가 변경 될 때 업데이트되지 않습니다.

분류에서Dev

플로 차트는 데이터가 변경 될 때 끝에 새로운 포인트를 표시합니다.

분류에서Dev

React onChange 이벤트가 발생하지 않습니다.

분류에서Dev

글로벌 인스턴스 속성이 변경 될 때 Vue가 업데이트되지 않습니다.

분류에서Dev

목록 항목이 변경 될 때 Flutter ListView가 업데이트되지 않습니다.

분류에서Dev

(Laravel) 데이터베이스가 변경 될 때마다 인터페이스를 업데이트 하시겠습니까?

분류에서Dev

티타늄에서 textField 값을 변경할 때 변경 이벤트가 발생하지 않습니다.

Related 관련 기사

  1. 1

    SignalR에 대해 SqlDependency OnChange 이벤트가 발생하지 않음

  2. 2

    ObservableCollection 개체가 변경 될 때 ListView가 업데이트되지 않습니다.

  3. 3

    Polymer-페이지가 변경 될 때 분리 된 이벤트가 트리거되지 않습니다.

  4. 4

    asp.net의 페이지에서 유효성 검사가 시작될 때 확인란 변경 이벤트가 발생하지 않습니까?

  5. 5

    값이 범위에서 변경 될 때 Angular js ng-change 이벤트가 작동하지 않습니다.

  6. 6

    Combobox는 기본 데이터가 수정 될 때 액션 이벤트를 발생시킵니다.

  7. 7

    "PageTabViewStyle"이 포함 된 TabView는 @State var가 변경 될 때 콘텐츠를 업데이트하지 않습니다.

  8. 8

    값이 변경 될 때 DataGrid 데이터 트리거가 실행되지 않음

  9. 9

    내 onchange 이벤트가 트리거 될 때가 아니라 페이지로드시 발생하는 이유는 무엇입니까?

  10. 10

    ItemsSource가 변경 될 때 DataGrid가 업데이트되지 않음

  11. 11

    사용자를 수신하는 StreamProvider는 사용자가 변경 될 때 업데이트되지 않습니다.

  12. 12

    Angular2 : 변수가 변경 될 때 뷰가 업데이트되지 않습니다.

  13. 13

    UWP-이벤트에 의해 값이 변경 될 때마다 TextBlock.Text가 업데이트되지 않음

  14. 14

    전역 ratom이 변경 될 때 로컬 시약 원자가 업데이트되지 않습니다.

  15. 15

    컨트롤러가 변경 될 때보기 (템플릿)가 업데이트되지 않습니다.

  16. 16

    datepicker-datepicker 객체를 통해 초기화 될 때 onSelect 이벤트가 발생하지 않습니다.

  17. 17

    내 데이터가 변경 될 때 내 검색 파이프 필터가 내 템플릿을 업데이트하지 않습니다.

  18. 18

    각도기-DOM 요소가 변경 될 때 페이지 개체가 업데이트되지 않습니다.

  19. 19

    Heroku가 배포 한 Django 웹 페이지는 DB가 변경 될 때 업데이트되지 않습니다.

  20. 20

    해시 위치가 변경 될 때 이벤트를 트리거하는 방법

  21. 21

    Ember, #if item.value inside #each, 값이 변경 될 때 페이지가 업데이트되지 않았습니다.

  22. 22

    TComboBox의 ITEMINDEX를 변경해도 OnChange 이벤트가 트리거되지 않습니다.

  23. 23

    ng-disable은 표현식에 사용 된 변수가 변경 될 때 업데이트되지 않습니다.

  24. 24

    플로 차트는 데이터가 변경 될 때 끝에 새로운 포인트를 표시합니다.

  25. 25

    React onChange 이벤트가 발생하지 않습니다.

  26. 26

    글로벌 인스턴스 속성이 변경 될 때 Vue가 업데이트되지 않습니다.

  27. 27

    목록 항목이 변경 될 때 Flutter ListView가 업데이트되지 않습니다.

  28. 28

    (Laravel) 데이터베이스가 변경 될 때마다 인터페이스를 업데이트 하시겠습니까?

  29. 29

    티타늄에서 textField 값을 변경할 때 변경 이벤트가 발생하지 않습니다.

뜨겁다태그

보관