2012-06-07 20 views
1

我有一個項目,我需要監視第三方數據庫中的更改。SqlDependency在其他應用程序中導致錯誤

SqlDependency似乎是一個很好的解決方案,但它會在第三方應用程序中導致以下錯誤。

INSERT失敗,因爲下列SET選項不正確 設置: 'ANSI_NULLS,QUOTED_IDENTIFIER,ANSI_PADDING'。驗證用於索引視圖和/或 計算列和/或過濾索引和/或查詢通知 和/或XML數據類型方法和/或空間索引操作的索引的SET選項是否正確。

這是否指的是什麼SET選項

(下面時,我的測試程序沒有運行該應用程序正常工作)?

我已經完成的唯一設置操作是ALTER DATABASE TestDb SET ENABLE_BROKER以啓用通知。

我也做:

CREATE QUEUE ContactChangeMessages; 

CREATE SERVICE ContactChangeNotifications 
    ON QUEUE ContactChangeMessages 
    ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);  

這裏是我的Linqpad測試代碼,如果我在Management Studio中插入/更新/刪除記錄,工作正常。

void Main() { 
    const string cs = "Data Source=.;Initial Catalog=TestDb;Trusted_Connection=True"; 

    var are = new AutoResetEvent(false); 
    using (var connection = new SqlConnection(cs)) { 
     connection.Open(); 
     SqlDependency.Start(cs); 
     using (var cmd = new SqlCommand()) { 
     cmd.Connection = connection; 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "SELECT orderNo FROM dbo.Orders WHERE ProductNo = '111'"; 

      var dep = new SqlDependency(cmd, null, 60); 
    dep.OnChange += (s,e) => { 
       Console.WriteLine(e.Info); 
       are.Set(); 
      }; 
      using (var reader = cmd.ExecuteReader()) { 
       while (reader.Read()) { 
       } 
      } 
      are.WaitOne(); 
      SqlDependency.Stop(cs); 
     } 
    } 
} 

我不知道,也無法更改第三方應用程序如何連接到數據庫。如果需要更多信息,我可以運行sql分析器。

回答

2

它是指恰好在錯誤消息中提到的SET選項:

SET選項的設置不正確: 'ANSI_NULLS,QUOTED_IDENTIFIER, ANSI_PADDING'。

正確的設置,與其他限制一起,在Creating a Query for Notification描述:

當SELECT語句下的通知要求執行,即提交請求必須具有的選項 連接 連接設置如下:

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

注意注意

當數據庫兼容性級別設置爲90時,將ANSI_WARNINGS設置爲ON會將ARITHABORT設置爲ON。如果數據庫 兼容級別設置爲80或更低版本,則ARITHABORT選項 必須明確設置爲ON。

這些設置受:

您需要找到錯誤消息中提到的屬性不符合以及爲什麼(可能是數據庫設置)。數據庫上最可能設置了80個兼容級別。

更新。不要說,你說你可以成功創建查詢通知,但是應用程序本身失敗。應用程序必須明確地將其中一個設置設置爲OFF(可以通過檢查sys.dm_exec_sessions進行驗證)。您必須聯繫應用程序供應商,似乎她非常明確(儘管可能無意)使其應用程序與查詢通知不兼容。

+0

謝謝,我不明白查詢必須運行與通知請求相同的選項。應用程序確實將其中的一些設置爲關閉。 – adrianm

+0

SQL依賴關係連接是需要SET ARITHABORT ON的連接。使用第三方數據庫意味着我很猶豫要將數據庫級別的值設置爲適當的值。我仍在研究是否可以爲特定用戶授予默認值。 – BrandonG

相關問題