当前位置: 首页 > 编程语言 > C#

数据库更新后如何通知我的程序?当分享

时间:2023-04-10 17:00:26 C#

数据库更新时,我如何通知我的程序?我有一个C#程序可以查询SQLServer数据库中的某些值。目前,应用程序每分钟查询一次数据库以确保表是最新的。我希望能够做的只是在数据库更改/更新时进行查询。当数据库中的某些内容更新时,我如何通知我的程序?谢谢轮询数据库解决方案不是很优雅。来自ADO.NET的SqlDependency对您的情况很有用。它不使用轮询,而是使用通知机制。这些通知由您数据库中的ServiceBroker提供,因此需要在您的数据库中启用此服务。当指定的表更改(更新,删除,插入..)时,OnChange事件将引发以下是如何使用SqlDependency的示例:voidInitialization(){//创建依赖连接。SqlDependency.Start(connectionString,queueName);}voidSomeMethod(){//假设连接是一个打开的SqlConnection。//创建一个新的SqlCommand对象。using(SqlCommandcommand=newSqlCommand("SELECTShipperID,CompanyName,PhoneFROMdbo.Shippers",connection)){//创建依赖项并将其与SqlCommand关联。SqlDependencydependency=newSqlDependency(命令);//维护类成员中的引用。//订阅SqlDependency事件。dependency.OnChange+=newOnChangeEventHandler(OnDependencyChange);//执行命令。使用(SqlDataReaderreader=command.ExecuteReader()){//处理DataReader。}}}//处理程序方法voidOnDependencyChange(objectsender,SqlNotificationEventArgse){//处理事件(例如,使此缓存条目无效)。}voidTermination(){//释放dependency.SqlDependency.Stop(connectionString,queueName);}来自http://msdn.microsoft.com/en-us/library/62xk7953.aspx以下是启用ServiceBroker的方法(请注意,您将独占执行此操作-最好在重新启动sqlserver之后):http://blogs.sftsrc.com/stuart/archive/2007/06/13/42.aspx(断开的链接)可能的替代链接:http://technet.microsoft.com/en-us/library/ms166086(v=sql.105).aspx如果您使用的是SQLServer2005及更高版本,您可能会考虑使用SqlDependency对象,它表示在SQLServer2005实例之间具有查询通知依赖关系的应用程序。应用程序可以创建SqlDependency对象并注册以通过OnChangeEventHandler事件处理程序接收通知。有关详细信息,请参阅MSDN上的此链接。但是,请注意MS关于其使用的警告。建议使用缓存层,然后与该层协调使用SQLDependency。SqlDependency旨在用于ASP.NET或中间层服务,其中有相对较少的服务器对数据库具有活动依赖性。它不是为在客户端应用程序中使用而设计的,在客户端应用程序中,成百上千的客户端计算机将为单个数据库服务器设置SqlDependency对象。要在某些记录更新时得到通知,请避免应用程序使用TableDependency组件(在您的特定情况下为SqlTableDependency)查询您的表。这是一个例子:publicpartialclassWindow1:Window{privateIList_stocks;privatereadonlystring_connectionString="datasource=.;initialcatalog=myDB;integratedsecurity=True";私有只读SqlTableDependency_dependency;publicWindow1(){this.InitializeComponent();this.McDataGrid.ItemsSource=LoadCollectionData();this.Closing+=Window1_Closing;varmapper=newModelToTableMapper();mapper.AddMapping(model=>model.Symbol,"代码");_dependency=newSqlTableDependency(_connectionString,"股票",映射器);_dependency.OnChanged+=_dependency_OnChanged;_dependency.OnError+=_dependency_OnError;_dependency.Start();}privatevoidWindow1_Closing(objectsender,System.ComponentModel.CancelEventArgse){_dependency.Stop();}privatevoid_dependency_OnError(objectsender,TableDependency.EventArgs.ErrorEventArgse){throwe.Error;}privatevoid_dependency_OnChanged(对象发送者,TableDependency.EventArgs.RecordChangedEventArgse){if(_stocks!=null){if(e.ChangeType!=ChangeType.None){开关(e.ChangeType){caseChangeType.Delete:_stocks.Remove(_stocks.FirstOrDefault(c=>c.Symbol==e.Entity.Symbol));休息;caseChangeType.Insert:_stocks.Add(e.Entity);休息;caseChangeType.Update:varcustomerIndex=_stocks.IndexOf(_stocks.FirstOrDefault(c=>c.Symbol==e.Entity.Symbol));如果(customerIndex>=0)_stocks[customerIndex]=e.Entity;休息;}this.McDataGrid.Dispatcher.Invoke(DispatcherPriority.Background,newAction(()=>{this.McDataGrid.Items.Refresh();}));}}}privateIEnumerableLoadCollectionData(){_stocks=newList();使用(varsqlConnection=newSqlConnection(_connectionString)){sqlConnection.Open();使用(varsqlCommand=sqlConnection.CreateCommand()){sqlCommand.CommandText="SELECT*FROM[Stocks]";使用(varsqlDataReader=sqlCommand.ExecuteReader()){while(sqlDataReader.Read()){varcode=sqlDataReader.GetString(sqlDataReader.GetOrdinal("代码"));varname=sqlDataReader.GetString(sqlDataReader.GetOrdinal("名称"));varprice=sqlDataReader.GetDecimal(sqlDataReader.GetOrdinal("价格"));_stocks.Add(newStock{Symbol=code,Name=name,Price=price});}}}}返回_stocks;}对表执行的每个INSERTUPDATE或DELETE操作都会触发事件处理程序并向您报告修改后的值,因此,如果您有兴趣使C#Datatable保持最新,则可以从事件处理程序获取新数据。我希望能够做的只是在数据库更改/更新时进行查询。当数据库中的某些内容更新时,我如何通知我的程序。数据库无法将通知推送到应用程序。应用程序需要轮询数据库以检查更新,然后适当地处理更新。如果“更新数据库”指的是对任何应用程序的任何更新,那你就不走运了:这是不可行的。但是,如果您指的是应用程序所做的更改,那很容易:对数据库的每次更新都会引发事件并让处理程序响应事件。以上是C#学习教程:数据库更新后如何通知我的程序?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: