我正在使用SqlDependency来监视数据库中的更改.让我们说,这些是股票报价,以使例子易于理解.该应用程序还使用(另一个)SqlDependeny-Object来监视静态数据的更改,这些更改缓存在应用程序中.
我所做的是,SqlDependency.Start()在启动应用程序时启动依赖关系,并SqlDependeny.Stop在关闭应用程序时调用.到目前为止,一切都运作良好.
现在,当用户选择股票代码时,会设置另一个SqlDependency并通知我有关我可以采取措施的更改.当用户更改他想要跟踪的符号时,我必须设置一个新的SqlDependency,并且必须清除旧的SqlDependency.
我的问题是:这是真的吗?我怎样才能清除特定的依赖关系?SqlDependency.Stop()是一个静态方法,并停止所有依赖 - 甚至在那里我很不确定SQL服务器上的通知订阅是否真的被清除 - 或只是等待进入超时.
如果这是使用SqlDependency进行缓存的正确方法,或者是否有其他好的和简单的实践来实现这一点,这一切都提出了一个问题?
这是我第一次需要使用SqlDependency,所以我希望这是我犯的一个愚蠢的错误.
我遇到的问题是当sql表更改时,OnChanged事件不会触发.没有错误或任何事情只是它不会触发.
这是代码
public class SqlWatcher
{
private const string SqlConnectionString = "Data Source = CN-PC08\\DEV; Initial Catalog=DEP; User = sa; Password=******";
public SqlWatcher()
{
SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
perm.Demand();
SqlCommand cmd = new SqlCommand("SELECT [DataAvaliable], [RowNumber] FROM [dbo].[Trigger]", new SqlConnection(SqlConnectionString));
SqlDependency sqlDependency = new SqlDependency(cmd);
sqlDependency.OnChange += On_SqlBitChanged;
}
private void On_SqlBitChanged(object sender, SqlNotificationEventArgs sqlNotificationEventArgs)
{
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= On_SqlBitChanged;
// Fire the event
if (NewMessage != null)
{
NewMessage(this, new EventArgs());
}
}
public …Run Code Online (Sandbox Code Playgroud) 在我的一个项目(现已上线)中使用 SQLDepdendency 作为队列实现后,发现它已损坏(参见http://rusanu.com/2008/01/04/sqldependencyonchange-callback-timing/)。
我正在拼命寻找替代品。我专注于使用 SQLNotificationRequest 作为替代,这是 SQLDependency 通过在运行时动态创建队列和 ServiceBroker 服务来创建方便的实现的方法。
我已经搜索了互联网,但我似乎无法在 SQLNotificationRequest 上找到任何好的例子,我在这里查看了http://msdn.microsoft.com/en-us/library/3ht3391b(v=vs.80).aspx,但是代码有问题,无法按预期工作。
我还查看了代码项目,http://www.codeproject.com/Articles/18130/Advanced-SQL-SQLNotificationRequest-Functiona但作者坚持认为代码只是一个概念证明,也没有按预期运行。
有没有人有关于 SQLNotificationRequest 的好资源?一本书可能有一个很好的例子,或者可能建议如何修复link1中的代码?
我已经运行了代码,但它会继续检查通知,而不是仅在数据库实际发生更改时才触发(更改计数器持续运行)

考虑这个例子:
INSERT INTO [Table] (column1)
SELECT value1
Run Code Online (Sandbox Code Playgroud)
如果我要在SSMS中执行此命令,关于ac#forms应用程序,为了识别此事件,我需要做些什么?像显示MessageBox此事件发生时的应用程序一样简单.我似乎无法解决这个问题或找到任何有用的数据.我试图使用,SqlDependency但没有运气.如果那是我需要走的道路,有人能帮我理解这个概念好一点吗?
我开发了一个连接到signalR hub的网页,它连接到带有angularjs的jquery代码.sqldependency.onchange发生事件时会向客户端发送消息,但是,对于连接的每个客户端,消息都会复制到每个客户端.因此,如果连接了两个客户端,则每个客户端都会收到两条消息,依此类推.
以下是步骤:
clients.all.renewProducts()"Database SQL Dependency change detected: Update" app.js:44:12 (Twice)Hub.cs
public static void SignalRGetData(string data)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SignalRGetData>();
context.Clients.All.renewData(data);
// Recereate data and sql dependency
new DataRespository().GetData();
}
Run Code Online (Sandbox Code Playgroud)
DataRespository.cs _dependency_OnChange
public void _dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if(e.Info == SqlNotificationInfo.Update)
{
ProductHub.GetProducts("Database SQL Dependency change detected: " + e.Info);
}
Run Code Online (Sandbox Code Playgroud)
}
的GetData
public IEnumerable<ProductInventoryDetail> GetData()
{
using(var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DynamicPricing"].ConnectionString))
{
conn.Open();
var reposQuery =
"SELECT …Run Code Online (Sandbox Code Playgroud) 我有一个在具有SqlDependency/查询通知的服务器上运行的应用程序- 监视不同服务器上的表的更改.
它工作正常,直到我们重新启动/重新启动SQL Server.由于某些维护和修补程序重新启动SQL Server时,另一个应用程序将引发以下错误并停止.我可以肯定地说它停止了,因为一旦SQL Server启动并运行它就不会监视更改.
我必须重新启动应用程序才能重新订阅查询通知.我没有在代码中抛出任何会阻止应用程序的异常.我正在捕捉异常并发送电子邮件.
System.Data.SqlClient.SqlException(0x80131904):将请求发送到服务器时发生传输级错误.(提供者:TCP提供者,错误:0 - 远程主机强制关闭现有连接.)--->
System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.
我是SqlDependency/查询通知的新手,所以我不确定这是否是预期的行为或我做错了什么.这是我的理解(从其他帖子(SqlDependency Reliablity?)我不必重新启动作业重新订阅.
感谢您的时间和答案
我当前正在将SqlDependency与SQL Server 2012 Service Broker一起使用,并且希望能够配置两台服务器,既可以侦听Service Broker并提取队列,但消息总数应仅从队列中提取一次。每台机器都应尝试降低其能力,但是如果有太多机器进来,则应平衡其能力。现在,我启动该程序的两个实例,并且都在侦听。一旦添加了新消息,它们都会从队列中提取同一条消息并运行代码。
SqlDependency不是我想要做什么的解决方案吗?什么是更好的解决方案呢?
我有场景使用2个不同的SqlDependencies与2个不同的数据库连接,但调用一个函数.
我希望第一个数据库使用SqlDependency获取更新,然后在第一个数据库更改时同步第二个数据库,那么在第二个数据库更新时我想通过Signalr在客户端加载Kendo Grid的更改,简单的过程正在运行,但是第一次DB1更改它同步DB2然后DB2通知在客户端显示更改,但同样的过程在第二次更改DB1时,SqlDependency调用3次并通知客户端3次,第3次更改DB1其SqlDepency调用6时间或更长时间,表示下次更改后3到SqlDependency调用infite时间:
EmailHub(DB2 Hub)
public class EmailHub : Hub
{
private static string _connStringDB2 = ConfigurationManager.ConnectionStrings["MyDB2"].ToString();
[HubMethodName("updateRecords")]
public static void UpdateRecords()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<EmailHub>();
context.Clients.All.getUpdates();
}
}
Run Code Online (Sandbox Code Playgroud)HMailHub(DB1集线器)
public class HMailHub : Hub
{
private static string _connStringDB1 = ConfigurationManager.ConnectionStrings["MyDB1"].ToString();
[HubMethodName("updateRecords")]
public static void UpdateRecords()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<EmailHub>();
context.Clients.All.getUpdates();
}
}
Run Code Online (Sandbox Code Playgroud)GetEmailMessagesSQL(DB2函数)
public IEnumerable<EmailAflAwmMessageDM> GetEmailMessagesByAccountSQL(string emailid)
{
var messages = new List<EmailAflAwmMessageDM>();
// sync hmailDb to LocalDb by EmailAccountId
HMailServerSync objEmailSync = new HMailServerSync();
objEmailSync.GetEmailMessagesByAccount(Guid.Parse(emailid)); …Run Code Online (Sandbox Code Playgroud)我尝试开发一个asp.net mvc应用程序,并尝试使用signalr.问题是我有两个表来控制项目中的用户通知.我有一个Notification表和NotificationUser表,它是多对多的通知和用户表.我正在尝试,如果用户在系统中向另一个用户创建通知,我会尝试显示一个弹出窗口,用一个简单的消息来确认用户,例如'嘿!收到新通知'.问题是信号器的javascript更改功能击中了这么多次.我在下面列出的signalR中使用了所有步骤
存储过程
ALTER PROCEDURE [dbo].[GetNotifications]
@userid int
AS
BEGIN
select n.Ntf_Title,Ntf_Description,n.Ntf_Date from dbo.SysNotifications n INNER JOIN dbo.SysNotificationUser u on n.Ntf_ID =u.NtU_NtfID where NtU_UserID=@userid AND NtU_IsRead=0
END
Run Code Online (Sandbox Code Playgroud)
枢纽
[HubName("signalRHub")]
public class NtfHub : Hub
{
[HubMethodName("notifyChanges")]
public static void NotifyChanges()
{
var context = GlobalHost.ConnectionManager.GetHubContext<NtfHub>();
context.Clients.All.notifyChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
StartUp类
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
Run Code Online (Sandbox Code Playgroud)
部分视图
[HttpGet]
public ActionResult GetNtf()
{
//NtfRepo rp = new NtfRepo(this.HttpContext);
string connectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
int userid =id;
using …Run Code Online (Sandbox Code Playgroud) 我们在 .NET Web 应用程序中使用 SqlDependency。间歇性地在生产中,我们在尝试调用 Start 时收到以下错误:
NullReferenceException - Object reference not set to an instance of an object.
Server stack trace:
at System.Object.GetType()
at log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(SerializationInfo info, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage..ctor(IMethodCallMessage mcm)
at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage.SmuggleIfPossible(IMessage msg)
at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage …Run Code Online (Sandbox Code Playgroud) c# ×10
sqldependency ×10
sql-server ×4
signalr ×3
.net ×2
sql ×2
angularjs ×1
asp.net ×1
asp.net-mvc ×1
caching ×1
kendo-grid ×1
listener ×1