c# - SqlDependency 不适用于现有数据库

标签 c# webforms signalr sqldependency

我将 Signalr 与 SqlDependency 结合使用。我的代码有效,它向我显示了我想要的实时结果。但问题是它正在运行我新创建的数据库。如果我将数据库更改为旧数据库,则 SqlDependency 将停止工作并且不会在我的数据库表上进行更改检测。

下面是我的代码:

#region SignalRMethods
    [System.Web.Script.Services.ScriptMethod()]
    [System.Web.Services.WebMethod(EnableSession = true)]
    public GlobalApplicationError[] GetErrorsList()
    {
        var cs = "Data Source=.;Initial Catalog=NotifyDB;Integrated Security=True";
        using (var connection = new SqlConnection(cs))
        {
            connection.Open();
            SqlDependency.Start(cs);
            using (SqlCommand command = new SqlCommand(@"SELECT  [Form_Name],[Message],[Prepared_By_Date] FROM [GlobalApplicationError]", connection))
            {
                // Make sure the command object does not already have
                // a notification object associated with it.

                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                using (var reader = command.ExecuteReader())
                    return reader.Cast<IDataRecord>()
                        .Select(x => new GlobalApplicationError()
                        {
                            Form_Name = x["Form_Name"].ToString(),
                            Message = x["Message"].ToString(),
                            Prepared_By_Date = Convert.ToDateTime(x["Prepared_By_Date"])
                        }).ToList().ToArray();
            }
        }
    }

    private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        MyHub.Show();
    }
    #endregion

如果我更改连接字符串中的数据库,以上代码在数据库 NotifyDB 上完美运行,但在我现有的 eprocure 上则不行。因为我正在使用 asmx 网络服务,所以我总是更新我的网络服务的引用。另外,我在两个数据库上都将 enable_broker 设置为 true。

数据库屏幕截图:

NotifyDB

enter image description here

电子采购

enter image description here

enter image description here

输出

enter image description here

请让我知道我在代码中做错了什么。提前致谢。

最佳答案

让我们结束这个。在网上集思广益后,我成功地找到了答案。

我已经使用以下查询检查了我的数据库 sys.transmission_queue:

从 sys.transmission_queue 中选择 *

因为我们的通知很可能会在那里,因为它们无法送达而被保留。 transmission_status 解释了为什么会发生这种情况。

我发现有以下错误:

Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist

谷歌它并找到以下有用的链接:

Troubleshooting SQL Server Error 15517

之后我运行上面链接中简要定义的以下查询

EXEC sp_MSForEachDB 
'SELECT ''?'' AS ''DBName'', sp.name AS ''dbo_login'', o.name AS ''sysdb_login''
FROM ?.sys.database_principals dp
LEFT JOIN master.sys.server_principals sp
ON dp.sid = sp.sid
LEFT JOIN master.sys.databases d 
ON DB_ID(''?'') = d.database_id
LEFT JOIN master.sys.server_principals o 
ON d.owner_sid = o.sid
WHERE dp.name = ''dbo'';';

通过这样做,我找到了 sys.databases 所说的几个拥有所有者的数据库。但是,当我从数据库的 sys.database_principals 检查它时,SID 与 dbo 不匹配。我的 dbo_login 专栏返回 NULL。这是问题的明显迹象。您还可能会看到 dbo_login 和 sysdb_login 之间不匹配。似乎只要 dbo_login 匹配合法登录,就不会生成错误。我在我的一台服务器上的某些数据库上发现了这一点。虽然它现在没有引起问题,但我会设法纠正不匹配。

更正错误:

更正错误的最简单方法是在具有与 dbo 的 NULL 登录匹配的数据库上使用 ALTER AUTHORIZATION。很简单:

更改数据库上的授权::eprocure 到 sa;

所以最后。我得到了我想要的,我的 SQL 依赖性运行良好。这都是我的结局。谢谢你帮我写这篇文章。感谢您抽出宝贵时间。快乐编码。

关于c# - SqlDependency 不适用于现有数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53926956/

相关文章:

javascript - 如何使用 ASP.NET Web API + AngularJs 基于 cookie 的身份验证来验证 cookie

c# - .net 的错误报告框架

c# - 在正则表达式中使用捷克字符

c# - 在 .NET Core 中使用反射

c# - 如何使用 HTML Agility 实用程序提取 url 的标题、图像和描述

python - 在 Django 表单发布请求中访问单选/复选框按钮选择

redis - 为什么 SignalR.Redis 在 NuGet 上不可用?

c# - 使用Web API作为SignalR服务器并从Windows服务使用它

javascript - 使用身份服务器 4 匿名访问 SignalR hub

javascript - 关于 HTML 表单的查询