2011-11-23 71 views
1

在我的應用程序中,我需要異步調用存儲過程。 爲此,我使用Sql Service Broker。 這些步驟涉及創建異步調用。異步調用存儲過程使用服務代理

1)我創建了Message,Contract,Queue,Service。 併發送messages.I可以在'ReceiveQueue1'中看到我的消息。

2)我創建了一個存儲過程和隊列 當我執行存儲過程(proc_AddRecord)時,它只執行一次。 它讀取隊列中的所有記錄並將這些記錄添加到表中。 012pt高興這一點它的工作正常。 但是,當我向'ReceiveQueue1'添加一些新消息時,我的存儲過程不會自動將這些 記錄添加到表中。我必須重新執行存儲過程(proc_AddRecord) 以添加新消息。爲什麼Stored proc沒有被執行。 我應該這樣做,以便異步調用存儲過程。 使用Service Broker的重點是異步調用存儲過程。 我完全不熟悉SQL Server Service Broker。 感謝任何幫助。 這裏是我的存儲過程

--exec proc_AddRecord 

ALTER PROCEDURE proc_AddRecord 
AS 

Declare 
    @Conversation UniqueIdentifier, 
    @msgTypeName nvarchar(200), 
    @msg varbinary(max) 

While (1=1) 
Begin 
    Begin Transaction; 

    WAITFOR 
    (
     Receive Top (1) 
      @Conversation = conversation_handle, 
      @msgTypeName = message_type_name, 
      @msg = message_body 
     from dbo.ReceiveQueue1 
    ), TIMEOUT 5000 


    IF @@Rowcount = 0 
     Begin 
      Rollback Transaction 
      Break 
     End 
    PRINT @msg 
    If @msg = 'Sales' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(101,'Reeves',51, 29) 
      COMMIT Transaction 
      Continue 
     End 
    If @msg = 'HR' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(102,'Cussac',55, 14) 
      COMMIT Transaction 
      Continue 
     End 

    Begin 
     Print 'Process end of dialog messages here.' 
     End Conversation @Conversation 
     Commit Transaction 
     Continue 
    End 
    Rollback Transaction 
END 

ALTER QUEUE AddRecorQueue 
WITH ACTIVATION (
       PROCEDURE_NAME=proc_AddRecord, 
       MAX_QUEUE_READERS = 1, 
       STATUS = ON, 
       EXECUTE AS 'dbo'); 

回答

2

你說你是執行存儲過程的代碼,你不應該需要做的是,一次也沒有,它應始終激活完成。

如果您的激活位於'ReceiveQueue1'而不是'AddRecorQueue',我無法看到其餘代碼,但名稱顯示它。

您的存儲過程從哪裏開始和結束?通常我會在存儲過程應該結束的AS語句和END之後放置BEGIN,如果您沒有這些,那麼您需要使用GO語句將它分離出來。否則,您的ALTER QUEUE語句將成爲存儲過程的一部分

您還有「回滾事務」,因此即使激活正在工作,它也會全部回滾,或者提出錯誤,表示沒有事務IF語句被觸發。

我建議你關注一般this tutorial for service brokerthis one about internal activation。他們應該讓你開始。

+0

非常好,我添加了激活到''ReceiveQueue1',它的工作完美。我在最後刪除了回滾。謝謝你的幫助。 – Henry