2016-03-30 14 views
1

Ich versuche, Abfragebenachrichtigungen für ein aktuelles Projekt umzusetzen. Ich implementiere Abfragebenachrichtigungen mit SqlDependency. Ich bin in der Lage, den Code zu arbeiten, wenn ich für die Abfrage Inline-SQL tue direkt im Ado.net Befehl jedoch, wenn ich die gleiche genaue Abfrage in einer gespeicherten Prozedur der Abfrage Benachrichtigung zu arbeiten scheint nicht setzen. Es gibt in den SqlNotificationEventArgs den Wert der Abfrage (8) in den e.Info Parametern des Ereignis args. Es feuert auch weiterhin ca. alle 30+ Sekunden.SQL Server Query Benachrichtigungen unter Verwendung der gespeicherten Prozedur

Public Sub GetCust(ByVal CustomerId As String) 

    Dim oConn As SqlConnection 

    Dim connectionString As string 

    connectionString = GetConnectionString() 

    SqlDependency.Stop(connectionString) 

    SqlDependency.Start(connectionString) 

    oConn = New SqlConnection(connectionString) 

'This is the code for the stored procedure path 
    'Dim oCommand As New SqlCommand("SelectCustomerInfo", oConn) 
    'oCommand.CommandType = CommandType.StoredProcedure 
    'oCommand.Parameters.AddWithValue("@CustomerId", CustomerId) 

'This is the code for using inline SQL 
    Dim strSQL As String 

    strSQL = "select [CustomerId],[name], [age],[gender],[favorite_food] from dbo.custpreferences where customerid = '" & CustomerId & "'" 

    Dim oCommand As New SqlCommand(strSQL, oConn) 
    oCommand.CommandType = CommandType.Text 
    oCommand.Notification = Nothing 

    Dim dep As SqlDependency = New SqlDependency(oCommand) 

    AddHandler dep.OnChange, AddressOf cust_onchange 

    oConn.Open() 

    Dim dataAdapter As SqlDataAdapter = New SqlDataAdapter(oCommand) 

    dataAdapter.Fill(dsCustomers) 

    If (Not dataAdapter Is Nothing) Then dataAdapter.Dispose() 

    If Not oConn Is Nothing Then oConn.Dispose() 

End Sub 

Private Sub cust_onchange(ByVal sender As System.Object, ByVal e As System.Data.SqlClient.SqlNotificationEventArgs) 

    GetCustInfo(mCustomer.strCustomerID) 

    Dim dep As SqlDependency = DirectCast(sender, SqlDependency) 

    RemoveHandler dep.OnChange, AddressOf cust_onchange 

End Sub 

Hier ist die gespeicherte Prozedur:

SET ANSI_NULLS ON 
GO 
SET ANSI_PADDING ON 
GO 
SET ANSI_WARNINGS ON 
GO 
SET CONCAT_NULL_YIELDS_NULL ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET NUMERIC_ROUNDABORT OFF 
GO 
SET ARITHABORT ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[SelectCustInfo] 
    @CustomerID VARCHAR(6) 
AS 
    SELECT 
     [CustomerId], [name], [age], [gender], [favorite_food] 
    FROM  
     dbo.CustInfo (NOLOCK) 
    WHERE  
     (CustomerId = @CustomerID) 

Irgendwelche Ideen, warum dies mit Inline-SQL arbeitet, um eine gespeicherte Prozedur vs mit?

+1

Haben Sie versucht, 'nolock' zu entfernen? http://stackoverflow.com/a/29948293/123422 –

+0

Hallo @PaulAbbott. Danke für die Empfehlung. Aus irgendeinem Grund habe ich nicht daran gedacht, das zu entfernen. Sobald ich es getan habe, hat es funktioniert. Also Danke für die Antwort. –

Antwort

0

konnte ich diese Arbeit bekommen, sobald ich den NOLOCK-Hinweis entfernt, die die gleiche wie READ UNCOMMITED ist.

Verwandte Themen