1

我有一个项目,我需要监视 3rd 方数据库中的更改。

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

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。

4

1 回答 1

3

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

注意 注意

当数据库兼容级别设置为 90 时,将 ANSI_WARNINGS 设置为 ON 会隐式将 ARITHABORT 设置为 ON。如果数据库兼容级别设置为 80 或更早,则必须将 ARITHABORT 选项显式设置为 ON。

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

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

更新。没关系,您说您可以成功创建查询通知,但应用程序本身会失败。应用程序必须在其连接上明确设置这些设置之一关闭(您可以通过检查 sys.dm_exec_sessions 来验证)。您必须联系应用程序供应商,似乎她非常明确(尽管可能是无意的)使他的应用程序与查询通知不兼容。

于 2012-06-07T07:50:39.620 回答