다음을 통해 공유


SqlDependency로 변경 내용 감지

ADO.NET 다운로드

쿼리 결과가 원래 검색된 결과와 다른 경우를 감지하기 위해 SqlDependency 개체를 SqlCommand에 연결할 수 있습니다. 연결된 명령의 결과가 변경될 때 발생하는 OnChange 이벤트에 대리자를 할당할 수도 있습니다. 명령을 실행하기 전에 SqlDependency를 명령과 연결합니다. SqlDependencyHasChanges 속성을 사용하여 데이터를 처음 검색한 이후 쿼리 결과가 변경되었는지 여부를 확인할 수도 있습니다.

보안 고려 사항

종속성 인프라는 원본으로 사용하는 데이터가 특정 명령에 대해 변경된 경우 알림을 받기 위해 SqlConnection가 호출되면 열리는 Start을 사용합니다. 클라이언트가 SqlDependency.Start 호출을 시작할 수 있는지 여부는 SqlClientPermission의 사용 및 코드 액세스 보안 특성을 통해 제어됩니다. 자세한 내용은 쿼리 알림 사용을 참조하세요.

예시

다음 단계에서는 종속성을 선언하고, 명령을 실행하고, 결과 집합이 변경될 때 알림을 받는 방법을 보여 줍니다.

  1. 서버에 대한 SqlDependency 연결을 시작합니다.

  2. SqlConnectionSqlCommand 개체를 만들어 서버에 연결하고 Transact-SQL 문을 정의합니다.

  3. SqlDependency 개체를 만들거나 기존 개체를 사용하여 SqlCommand 개체에 바인딩합니다. 내부적으로 이 연결은 SqlNotificationRequest 개체를 만들고 필요에 따라 명령 개체에 바인딩합니다. 이 알림 요청에는 이 SqlDependency 개체를 고유하게 식별하는 내부 식별자가 포함됩니다. 또한 이를 통해 아직 활성화되지 않은 클라이언트 수신기가 시작됩니다.

  4. OnChange 개체의 SqlDependency 이벤트에 이벤트 처리기를 등록합니다.

  5. Execute 개체의 SqlCommand 메서드를 사용하여 명령을 실행합니다. 명령이 알림 개체에 바인딩되기 때문에 서버에서는 알림을 생성해야 하는 것으로 인식하며 대기열 정보는 종속성 대기열을 가리킵니다.

  6. 서버에 대한 SqlDependency 연결을 중지합니다.

이후에 사용자가 기본 데이터를 변경하는 경우 Microsoft SQL Server는 이러한 변경 내용에 대해 보류 중 알림이 있음을 감지하고, SqlDependency.Start를 호출하여 생성된 기본 SqlConnection을 통해 처리되어 클라이언트로 전달되는 알림을 게시합니다. 클라이언트 수신기는 무효화 메시지를 수신합니다. 그러면 클라이언트 수신기는 연결된 SqlDependency 개체를 찾아 OnChange 이벤트를 발생시킵니다.

다음 코드 조각에서는 샘플 애플리케이션을 만드는 데 사용할 수 있는 디자인 패턴을 보여 줍니다.

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.

    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
        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+=new
           OnChangeEventHandler(OnDependencyChange);

        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender,
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

다음 단계