-->

的SqlDependency导致错误在其他应用程序(SqlDependency causes err

2019-07-29 18:42发布

我有一个项目,我需要监测第三方数据库更改。

的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测试代码,如果我在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事件探查器。

Answer 1:

它是指恰好在错误消息中提到的SET选项:

SET选项的设置不正确: 'ANSI_NULLS,QUOTED_IDENTIFIER,ANSI_PADDING'。

正确的设置,与其他限制一起,在描述创造通知查询 :

当在通知要求执行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时,如果数据库兼容级别设置为80或更早的版本,ARITHABORT选项必须明确地设置为ON数据库兼容级别设置为90。

这些设置的影响:

  • 当前数据库设置,它可以在被视为sys.databases
  • 会话设置,它可以被看作sys.dm_exec_sessions
  • 由程序/触发创建设置,这可以使用被看作OBJECTPROPERTY()

你需要找到其财产从错误消息中提到的那些为不合格,为什么(可能是一个数据库设置)。 最有可能的是在数据库上设置一个80兼容级别。

更新。 没关系,你说,你可以成功地创建一个查询通知,但随后本身出现故障的应用程序。 应用程序必须明确设置,这些设置一个关闭它的连接(您可以通过检查sys.dm_exec_sessions验证)。 您必须与应用程序供应商,好像她是非常明确的(尽管可能是无意的),使他的应用与查询通知不兼容。



文章来源: SqlDependency causes error in other application