1

現在のプロジェクトにクエリ通知を実装しようとしています。を使用してクエリ通知を実装していますSqlDependency。Ado.net コマンドでクエリのインライン SQL を直接実行すると、コードを動作させることができますが、まったく同じクエリをストアド プロシージャに入れると、クエリ通知が機能しないようです。イベント引数SqlNotificationEventArgsのパラメータに Query(8) の値を返します。e.Infoまた、約発射し続けます。30秒以上ごと。

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

ストアド プロシージャは次のとおりです。

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)

これがインライン SQL とストアド プロシージャの使用で機能する理由はありますか?

4

2 に答える 2

0

READ UNCOMMITED と同じ NOLOCK ヒントを削除すると、これを機能させることができました。

于 2016-03-31T09:11:39.643 に答える
0

でストアプロシージャを使用する場合SqlDependency

使用禁止

  1. ノーロック
  2. NOCOUNTをオンに設定
于 2018-07-20T09:33:30.467 に答える