SqlDependency导致其他应用程序出错

时间:2012-06-07 07:02:18

标签: sql-server sqldependency

我有一个项目需要监控第三方数据库中的更改。

SqlDependency似乎是一个很好的解决方案,但它会在第三方应用程序中导致以下错误。

  

INSERT失败,因为以下SET选项不正确   设置:'ANSI_NULLS,QUOTED_IDENTIFIER,ANSI_PADDING'。验证   SET选项适用于索引视图和/或索引   计算列和/或筛选索引和/或查询通知   和/或XML数据类型方法和/或空间索引操作。

(当我的测试程序没有运行时,应用程序正常工作)

这涉及哪些SET选项?

我所做的唯一设置操作是ALTER DATABASE TestDb SET ENABLE_BROKER来启用通知。

我也做了:

CREATE QUEUE ContactChangeMessages;

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

这是我的Linqpad测试代码,如果我在管理工作室插入/更新/删除记录,它可以正常工作。

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 profiler。

1 个答案:

答案 0 :(得分:3)

它完全指错误消息中提到的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
     

注意事项

     

将ANSI_WARNINGS设置为ON时隐式将ARITHABORT设置为ON   数据库兼容级别设置为90.如果是数据库   兼容级别设置为80或更早,ARITHABORT选项   必须明确设置为ON。

这些设置受以下因素影响:

您需要找到错误消息中提到的属性不符合的属性以及原因(可能是数据库设置)。最有可能是在数据库上设置了80个兼容级别。

更新。没关系,你说你可以成功创建一个查询通知,然后应用程序本身就会失败。应用程序必须在其连接上明确设置其中一个设置为OFF(您可以通过检查sys.dm_exec_sessions进行验证)。您必须联系应用程序供应商,看起来她非常明确地(尽管可能是无意中)使他的应用程序与查询通知不兼容。