我有一个项目,我需要监视 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。