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?
Haben Sie versucht, 'nolock' zu entfernen? http://stackoverflow.com/a/29948293/123422 –
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. –