关闭顶部展开顶部

剖析SQL Server 2005查询通知之基础篇_Mssql数据库教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:浅谈Linq To Sql集成数据库语言的优劣
Linq To Sql是Microsoft开发的针对解决data!=object问题的新技术。在笔者的一系列的文章中,对它已经做了大量的介绍。现在,笔者将从经验的角度,谈谈它的优劣。 1、Linq To Sql的优点 在Li

在本系列文章中,我们将深入探讨如何把.NET 2.0和SQL Server 2005的查询通知特征联合起来,以便通知应用程序何时关键数据发生变化进而达到消除反复查询数据库的目的。

一、引言

数据库应用程序的典型问题之一是更新陈旧的数据。

设想有一个典型的显示产品及其分类的电子商务网站。一个供应商的产品列表很可能并不经常发生变化,而其分类列表甚至更不会频繁更改。然而,在用户每次浏览该网站时,必须从数据库中反复查询这些列表。这显然是一种典型的低效资源利用,开发者和架构师都在绞尽脑汁想办法以减少这种浪费。

缓冲技术正是“最小化”对这种几乎“停滞”的数据进行重复查询的技术之一。这种数据可以被进行一次性查询并存储在一个缓冲区中,而且应用程序可以从缓存中重复地存取数据。偶尔情况下,才更新缓存以得到新数据。但是,围绕更新缓存的时间调度方面出现了几个问题。该多长时间操作一次呢?例如,你每隔多长时间希望你的产品分类改变一次?每隔几个月一次?每隔两个月刷新一次该缓冲区如何?你知道会发生什么吗?就在你刷新缓存之后,分类被更新,而且在下一次刷新前在两个月的时间里它将保持陈旧。

查询通知,是微软的ADO.NET和SQL Server小组协作开发的新成果。简言之,查询通知允许你缓冲数据并且仅在SQL Server中的数据发生变化时才发出通知。一旦接到通知,你就可以刷新你的缓冲区或者采取你需要的任何措施。

在SQL Server 2005中引入的一种新特征“Service Broker”使得查询通知成为可能。Service Broker把队列机制引入到数据库管理中,它使用一组队列与服务进行通讯,而服务反过来也知道如何往回通讯以调用相应的实体。其实,这些队列和服务都是一些与表、视图和存储过程一样的类对象。尽管完全可以在SQL Server内使用Service Broker,但是ADO.NET知道如何与Service Broker进行通讯以触发这种机制并且从Service Broker中检索回通知。

注意 当SQL Server中的数据发生改变时,查询通知允许你缓冲数据并且通知你。

在.NET一端,存在很多种“钩入”这种功能的方式。ADO.NET 2.0提供了System.Data.SqlClient.SqlDependency和System.Data.Sql.SqlNotificationRequest类。SqlDependency是SqlNotificationRequest的一种高级实现,并且是当使用ADO.NET 2.0时你最有可能使用的类。ASP.NET 2.0也通过System.Web.Caching.SqlCache-Dependency类(它提供了一个针对SqlDependency的包装器)与Service Broker进行通讯,而且这是直接通过在一个ASP.NET页面中使用<%OutputCache>指令以声明方式提供的功能实现的。这允许ASP.NET开发者容易地实现使依赖于SQL Server中的数据中的缓存无效。

二、.NET与Service Broker的通讯

上面这些技术是如何联合到一起来解决“缓冲之谜”的呢?尽管你可以采取很多的措施以允许SQL Server把服务提供给.NET;但是,关键还在于,发送到SQL Server的查询具有一个依附到它们的标志以便告诉SQL Server,除了返回结果集外,SQL Server还应该把该查询(及其请求者)注册到Service Broker。为此,你要创建一个感知该查询的队列和一个依附到该队列的服务,并且知道如何返回到客户端。如果该结果集中的任何一行在数据库中得到更新,那么在相关队列中的项将触发,并且反过来,把一条消息发送到它的服务,然后把一个通知发送回初始化该请求的应用程序。

图1是SQL Server Management Studio的一个快照,它显示了在数据库的Service Broker部分中的队列(Queues)和服务(Services)。

图1.该图显示了.NET的查询通知所使用的Pubs数据库中的缺省队列和服务。

下面是理解这一过程的一些有关重要内容:

· 存在一些规则以指出SQL Server接收哪些类型的查询。

· 一旦SQL Server发送回通知,队列和服务即被删除。这意味着,你仅能在每次请求中得到一个通知。一个典型的应用程序会重新查询数据库并且,在同时,请求在Service Broker中创建一种新的依赖性。

· 返回到应用程序的信息也不过是“something changed”。该应用程序并不被通知改变了什么(请参考本文中的SQLNotificationEventArgs
节了解更多的信息)。

· 尽管依赖性被绑定到从查询中返回的行上;但是,它并不被查询中的单个列加以过滤。如果你有一个查询—它返回你的组织的基本成员姓名以及那些单个改变之一的地址(但是,其姓名并不改变),这将触发一个改变通知。很希望,这种特殊行为在未来的版本中会有所改变。

· 通知被返回,通过一个专门针对这一目的建立的SqlConnection。这个连接并不加入连接池中。

三、何时使用查询通知

查询通知是针对于并不经常改变的数据而设计的。最好把它应用于服务器端的应用程序(例如ASP.NET或remoting)而不是客户端应用程序(例如Windows表单应用程序)。记住,每一个通知请求都要在SQL Server中注册。如果你拥有大量的都有通知请求的客户端应用程序,那么这可能会导致你的服务器产生资源问题。微软推荐,对于客户端应用程序,你应该限制查询通知使用为不多于十个并行用户。

对于大规模应用程序来说,查询通知可能是一种强有力的帮助,而不用简单地添加越来越多的服务器以满足要求。设想,有一家大型的为成千上百万用户提供在线软件更新服务的软件公司。不是使每一个用户的更新操作都触发服务器上的另一个查询来确定需要哪些组件,而是能够缓冲查询结果并且可以直接从该缓存中服务匹配的查询。

注意:对于客户端应用程序来说,应该限制你的查询通知使用—不多于十个并发用户。

对于较小规模的情况而言,下拉式列表框是另一种典型的数据集;此时该数据集更新的次数并不如请求的次数多。产品列表、州列表、国家列表、供应商、销售人,甚至更多不太需要频繁改变的信息正是使用通知的较好候选。

四、为使用查询通知作准备

因为默认情况下SQL Server 2005处于高度安全的状态,所以你需要“打开”一些功能才能使用查询通知。首先,你要使用的每一个数据库都需要启动Service Broker功能。为此,你可以在T-SQL中使用如下命令实现:

USE mydatabase

ALTER DATABASE mydb SET ENABLE_BROKER

另外,你需要授予一些SQL Server权限以允许非管理员帐户能够参与使用查询通知。

五、SqlDependency.Start和Stop

SqlDependency和SqlCacheDependency都要求,在任何通知请求前先调用静态方法SqlDependency.Start()。这个方法负责创建一个SqlConnection以实现在数据改变时接收通知。注意,你仅需要在一个应用程序的生命周期的开始建立这些内容。例如,在一个ASP.NET应用程序中,global.asax文件的Application_Start事件处理器就是实现这一功能的好地方。

注意,对包含在通知中的每一个连接都应该调用Start方法。因此,如果你在应用程序中存取多个数据库,那么你需要为每一个数据库调用Start。在下列示例中,有一个针对Pubs数据库的连接串pubsConn,它在这个应用程序的web.config文件中定义。

为了切断这个连接,你可以使用SqlDependency.Stop(),这也是一个静态方法。

以下为引用的内容:
Sub Application_Start(ByVal sender as Object, _
ByVal e as EventArgs)
System.Data.SqlClient.SqlDependency.Start _
(System.Configuration.ConfigurationManager. _
Connectionstrings("pubsConn").ConnectionString)
End Sub
Sub Application_End(ByVal sender as Object,
ByVal e as EventArgs)
System.Data.SqlClient.SqlDependency.Stop _
(System.Configuration.ConfigurationManager. _
Connectionstrings("pubsConn").ConnectionString)
End Sub

如果你在调用Start和Stop的同时观察SQL Server Profiler,那么你会看到许多有趣的信息。当调用Start时,应用程序运行一个查询以确保支持Service Broker,然后创建一个存储过程备以后用于清除在Service Broker基础结构中的SqlDependency队列和服务。最后,它运行一个SQL Server 2005 WaitFor命令,该命令负责查询在Notification Service部分的入口。这就是如果你使用ADO.NET的低级SqlNotificationRequest对象的话所有你需要显式完成的事情。

在整个的.NET 2.0的设计过程中,SqlDependency底层架构从一种推模式(来自SQL Server)改变为一种拉模式(来自.NET)。这样做的原因是为了解决第一次设计时所导致的一些安全问题。微软的Sushil Chordia在MSDN上发表了一篇有关于这种改进的文章,该文详细描述了这一改进的内在机理。

六、你的第一个通知

下面,让我们开始使用SqlDependency来分析一下所有上面这些是如何协同工作的。
首先,我们创建一个类NotificationTest来存取你的数据。在这个类中,还要创建一个典型的函数以便从Pubs数据库的Authors表中查询一些数据并返回一个SqlDataReader。

以下为引用的内容:
Imports System.Data.SqlClient
Public Class NotificationTest
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand(
"SELECT * FROM authors(", conn)")
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
End Class

现在,让我们修改代码来加入这种依赖性。首先,声明一个名为SqlDependency的对象。为了使之用于该类中的其它函数中,我把它定义为一个类变量。

然后,你需要改变这个查询。查询通知要求你显式地列举在你的查询中的列,以及总是使用一种“两部分”的表名。注意一下在修改后的代码示例中的新的查询文本。

然后,实例化新的SqlDependency并且把它依附到命令中。

就是这些。当执行命令时,依赖性随着它直到数据库。在它处理查询的同时,SQL Server能够看到这一依赖性并且把它发送到Service Broker以注册它。

以下为引用的内容:
Imports System.Data.SqlClient
Public Class NotificationTest
Dim dep As SqlDependency
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand( _
"SELECT au_id, au_lname,au_fname " & _
"FROM dbo.authors", conn)
dep = New SqlDependency(cmd)
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
End Class

现在,你已经注册了依赖性,但是当通知返回到应用程序时你还根本没有捕获它。不过,SqlDependency类提供了两种方式来了解一个通知。一种方式是通过OnChange事件,你可以通过创建一个代理来捕获它;另一种方式是通过属性HasChanges,你可以在你的应用程序逻辑中对之进行测试。在下列代码中,我在OnDepChange事件中添加了代码以便在后面的某个时候测试通知。

以下为引用的内容:

Imports System.Data.SqlClient
Public Class NotificationTest
Dim dep As SqlDependency
Public Function DepTest() As SqlDataReader
Dim conn As New SqlConnection(connstring)
conn.Open()
Dim cmd As New SqlCommand( _
"SELECT au_id,au_lname,au_fname FROM " _
"dbo.authors", conn)
dep = New SqlDependency(cmd)
AddHandler dep.OnChange, AddressOf OnDepChange
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader()
Return rdr
End Function
'处理器方法
Public Sub OnDepChange(ByVal sender As Object, _
ByVal e As SqlNotificationEventArgs)
Dim DepInfo As String = e.Info.ToString
'做一些事情以响应通知
End Sub
Public ReadOnly Property HasChanges() As Boolean
Get
Return dep.HasChanges
End Get
End Property
End Class

现在,我们来看一下其工作原理。首先,把一个断点放到OnDepChange事件的End Sub代码行。然后,从你喜欢的网页、表单程序或控制台程序中调用DepTest函数来进行测试。在返回SqlDataReader后,在Visual Studio 2005的Server Explorer或在SQL Server Management Studio中打开Authors表并且编辑某一个字段内容。例如,一旦锁定这一改变,那么,当你把光标移动到表中的一个新行时,断点应该被激活。

七、SQLNotificationEventArgs

当你看到通知的确从数据库中传来时,你可以分析一下相应变量的值,它是一个SqlNotificationEventArgs对象。SqlDependency总是随着OnChange事件返回这个对象,而且它是很有用的。其中,SqlNotificationInfo是一个具有18种可能值的枚举类型。其中,一些值对应情况正常,而另一些显示出了问题。这些枚举中有Update,Insert和Delete—告诉你在数据中发生了什么类型的变化。还有其它一些值即使在事件发生时也不会被发送。例如,重新启动服务器将激发所有的通知;而枚举值Drop或Truncate告诉你已经对依赖的表实现了某种操作。

另外,还存在一些依赖性甚至还不能被注册的情形,例如如果你试图对一个UPDATE查询设置一个依赖性将返回Invalid。而返回值Query显示你的查询语法并不符合通知的严格规则。上面枚举表中的最后两个枚举值,还有其它几个与不能注册查询相关的枚举值在执行该命令时被立即返回。

通过查找MSDN库中的有关SqlNotificationInfo枚举文档,你可以得到这些枚举的完全列表。

当我一些场合上谈论查询通知时,人们总是问我:“通知是否会告诉你发生了什么事情?”。回答是“不会”。

总之,SQLNotificationEventArgs能够向你给出一个通知中最为详细的信息,而这些信息在调试排错时是非常有用的。

分享:SQL2005数据库转到SQL2000的步骤
1. 生成for2000版本的数据库脚本 2005的manger studio -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 -- 右键要转到2000的库 -- 任务 -- 生成脚本 -- 在

来源:模板无忧//所属分类:Mssql数据库教程/更新时间:2008-08-22
loading.. 评论加载中....
相关Mssql数据库教程
闂傚倸鍊搁崐鐑芥倿閿曞倹鍎戠憸鐗堝笒閺勩儵鏌涢弴銊ョ仩闁搞劌鍊垮娲敆閳ь剛绮旈悽绋跨;闁靛牆顦伴悡娑㈡煕閵夈劌鐓愮紒鑸电〒缁辨挸顓奸崱娆忊拰闂佸搫鏈惄顖炲春閸曨垰绀冩い蹇庣椤矂姊绘担鐟扳枙闁衡偓鏉堚晜鏆滄俊銈呮噹妗呴梺鍛婃处閸ㄤ即宕¢搹顐$箚闁靛牆鍊告禍鐐箾鐎涙ḿ鐭嬮柛搴㈠▕閳ユ棃宕橀鍢壯囩叓閸ャ劍绀堥懖鏍⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷
濠电姷鏁告慨鐑藉极閹间礁纾绘繛鎴欏焺閺佸銇勯幘璺烘瀾闁告瑥绻戦妵鍕箻閸楃偟浠肩紒鐐劤椤兘寮婚悢鍏煎€锋い鎺嶈兌娴煎洤鈹戦埄鍐ㄧ祷闁绘鎹囧濠氭晸閻樿尙锛滃┑鐘绘涧濞层劑濡存繝鍐瘈闁冲皝鍋撻柛鏇ㄥ幐婵洦绻涢敐鍛悙闁挎洦浜獮濠囨偐濞茬粯鏅㈡繝銏f硾濡绂嶉悙顒傜瘈闂傚牊渚楅崕鎰版煟閹捐泛鏋涢柡灞炬礉缁犳稒绻濋崘鈺冨絽闂備浇顕х换鎴︽偂閿熺姴钃熼柣鏃傚帶缁€鍕煏閸繃顥滄い蹇ユ嫹
濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴濐潟閳ь剙鍊圭粋鎺斺偓锝庝簽閸旓箑顪冮妶鍡楀潑闁稿鎹囬弻娑㈡偄闁垮浠撮梺绯曟杹閸嬫挸顪冮妶鍡楃瑨閻庢艾鍢茶灋闁瑰濮风壕濂稿级閸碍娅呭ù鐘崇矋閵囧嫰骞橀崘鍙夊€悗鍨緲鐎氼噣鍩€椤掑﹦绉靛ù婊勭箞椤㈡ɑ銈i崘鈺冨幗闁硅壈鎻徊楣冨吹閳ь剟鏌f惔銏犲毈闁告ḿ鏅划鈺呮偄閻撳骸鑰垮┑鐐叉閸旀洘鎯旀繝鍐闁瑰鍋為悡锝囩磼閼搁潧鍝虹€殿喖顭烽弫鎰緞婵犲孩缍傞梻浣哥枃濡椼劑鎳楅懜闈涱嚤闁割偁鍎查埛鎴︽煟閻斿憡绶叉繛鍫氭櫊閺岀喖宕欓妶鍡楊伓
濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴濐潟閳ь剙鍊圭粋鎺斺偓锝庝簽閸旓箑顪冮妶鍡楀潑闁稿鎹囬弻娑㈡偄闁垮浠撮梺绯曟杹閸嬫挸顪冮妶鍡楃瑨閻庢艾鍢茶灋闁瑰濮风壕濂稿级閸碍娅呭ù鐘崇矋閵囧嫰骞橀崘鍙夊€悗鍨緲鐎氼厾鎹㈠┑瀣闂傚牊绋掗崐顖炴⒒閸屾艾鈧嘲霉閸ヮ剦鏁嬮柡宥庡幖閸ㄥ倿骞栧ǎ顒€濡肩紒鈧€n偁浜滈柟鐐殔鐎氬懎顫濋懜纰樻嫽婵炶揪绲块悺鏃堝吹濞嗘挻鈷戦悽顖e枤閸掓澘鐣濋敐鍫濆姷妞わ附鐓¢幗鍫曟倷鐎靛摜顔曢梺鐟扮摠閻熴儵鎮橀鍫熺厱閻庯綆浜跺Ο鈧梺鍝勮閸旀垿骞冮妶澶婄<婵炴垶锕╂导锟�
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨跺畷婵嗏枎閹捐泛绁︽繝鐢靛Т閸燁垶宕曢悢鍏肩厪濠电偛鐏濋崝銈夋煕閺冩挾鐣辨い顏勫暣婵″爼宕卞Δ鍐噯闂備胶枪閿曘倝骞楀⿰鍫濇瀬妞ゆ洍鍋撶€规洖銈稿鎾倷濞堝灝鏅i梻浣筋嚙鐎涒晝绮欓幒鎴犲箵闁秆勵殕閸庢鏌熼悜妯荤厸闁稿鎸鹃幉鎾礋椤掑偆妲扮紓鍌欐祰椤曆囨偋閹炬剚鍤曟い鎰剁畱缁犺崵绱撴担鑲℃垵鈻嶉姀銈嗏拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨跺畷婵嗏枎閹捐泛绁︽繝鐢靛Т閸燁垶宕曢悢鍏肩厪濠电偛鐏濋崝銈夋煕閺冩挾鐣辨い顏勫暣婵″爼宕卞Δ鈧ḿ鎴︽⒑缁嬫鍎愰柟鐟版喘瀵鈽夊鍡樺兊濡炪倖甯掗ˇ顖炲礈瀹曞洨纾藉〒姘搐閺嬫盯鏌ㄩ弴銊ら偗鐎殿噮鍋婂畷鎺楁倷閼碱剦妲堕柣鐔哥矊缁绘﹢骞冮敓鐘茬缂備焦岣块崢浠嬫煙閸忓吋鍎楅柛銊ュ暱閻f繂鈽夐姀锛勫幐闂佸憡渚楅崰姘辩不閻愮儤鐓欐い鏍ㄤ亢鐎氫即鏌嶇拠鏌ュ弰妤犵偛顑夐幃鈺冨枈婢跺矂妫峰┑鐘垫暩閸嬬偤骞愭繝姘殞濡わ絽鍟弲婵嬫煏婢诡垪鍋撻柛瀣尭椤繈鎮欓鈧锟�
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掆偓杩濋梺閫炲苯澧撮柡灞剧〒閳ь剨缍嗛崑鍛焊娴煎瓨鐓忛柛銉戝喚浼冮悗娈垮枙缁瑦淇婂宀婃Х濠碘剝褰冮悧鎾愁潖閻戞ê顕辨繛鍡楃箳濡诧綁姊洪棃鈺冪Ф缂傚秳绀侀锝囨嫚濞村顫嶅┑鈽嗗灦閺€閬嶅棘閳ь剟姊绘担鍝ョШ闁稿锕ョ粋宥夋倷閻戞ê娈戦梺鎯х箰濠€杈╁閽樺褰掓晲婢跺閿繝寰枫倕袚濞e洤锕幃娆撴嚋濞堟寧顥夋俊鐐€栧ú鈺冪礊娴i€涚箚闁归棿绀侀悡娑樷攽閻樻彃鏆炴繛鍛墬缁绘繈鎮介棃娑楃捕濠碘槅鍋呴悷鈺佺暦瑜版帗鍋ㄩ柣銏㈡暩閻e爼姊虹捄銊ユ灁濠殿喚鏁婚崺娑㈠箣閿旂晫鍘卞┑鐘绘涧濡顢旈埡鍛厓鐟滄粓宕滃▎鎾偓锕傛倻閻e苯绁︽繝鐢靛Т濞层倗绮绘繝姘厾闁告稑饪撮崯蹇旂箾閼测晛鏋涙慨濠呮閹瑰嫰濡搁妷锔惧綒闂備胶鎳撻崵鏍箯閿燂拷
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈡晝閳ь剟鎮块鈧弻锝呂旈埀顒勬偋婵犲洤鐭楅煫鍥ㄦ惄濞撳鎮楅敐搴濈凹闁圭櫢绲跨槐鎺楀焵椤掍胶绡€闁稿被鍊楅崬鐢告⒑閸忓吋鍊愭繛浣冲嫭鍙忛柛顐犲劜閻撶喖鏌熼崹顔碱伀缂佸鍣i弻鐔碱敊濞嗙偓缍堝┑鐐碘拡娴滎亪鐛箛鎾舵殕濠电姴鍊搁煢婵犵數濮烽弫鎼佸磻濞戙垺鍎戝ù鍏兼綑绾惧綊鏌¢崶銉ョ仾缂佺姵甯″缁樻媴閻熼偊鍤嬬紓浣筋嚙閸婃瓕鐏嬪┑鐐叉閸ㄥ綊鎯岄崱娑欑厓鐟滄粓宕滈悢濂夋綎婵炲樊浜滃婵嗏攽閻愬顣查柛銊ユ健楠炲啳顦归柟顔规櫊閹崇娀顢楁担璇″晭闂傚倷娴囬~澶嬬珶閸℃ɑ娅犳俊銈呮噹閻ら箖鏌熼梻瀵稿妽闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�
婵犵數濮烽弫鍛婃叏閻戝鈧倿鎸婃竟鈺嬬秮瀹曘劑寮堕幋婵堚偓顓烆渻閵堝懐绠伴柣妤€妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛缁嬫帡鏁嶅澶嬬厽闁哄倹瀵чˉ鐐睬庨崶褝韬い銏$☉椤繈顢楁担绯曞亾椤栫偞鐓熼幖娣灪閻ㄦ垹绱掗鍛仸濠碉紕鏁诲畷鐔碱敍濮橀硸鍟嬮梺璇查叄濞佳囧箺濠婂牊鍋╂繛宸簼閻撶喖骞栧ǎ顒€鐏柛鐔哥叀閺岀喖宕欓妶鍡楊伓
濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴濐潟閳ь剙鍊圭粋鎺斺偓锝庝簽閸旓箑顪冮妶鍡楀潑闁稿鎹囬弻娑㈡偄闁垮浠撮梺绯曟杹閸嬫挸顪冮妶鍡楃瑨閻庢艾鍢茶灋闁瑰濮风壕濂稿级閸碍娅呭ù鐘崇矋閵囧嫰骞橀悙钘変划閻庤娲栭悥鍏间繆閹间礁唯妞ゆ棁宕电粚鎸庣節绾板纾块柛瀣灴瀹曟劙寮介鐐殿唶闂佺厧顫曢崐鏍х暦閺屻儲鐓曢柟鏉垮悁缁ㄦ挳鏌涚€n偅灏い顐g箞閹煎綊顢曢妶鍛敪婵犵數鍎戠徊钘壝洪妶澶嬫櫇妞ゅ繐鐗勯埀顑跨閳藉螣濠婂嫭顥堥柛鈹惧亾濡炪倖甯婇悞锕€鈻嶉悩缁樼厱婵炲棗娴氬Σ铏圭磼閳锯偓閸嬫挻淇婇悙顏勨偓銈夊磻閹烘绐楁俊銈呭暊閸嬫挸顫濋悙顒€顏�
婵犵數濮烽弫鍛婃叏閻戝鈧倿鎸婃竟鈺嬬秮瀹曘劑寮堕幋婵堚偓顓烆渻閵堝懐绠伴柣妤€妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛缁嬫帡鏁嶅澶嬬厽闁哄倹瀵чˉ鐐烘煙娓氬灝濡兼い顏勫暟閹风娀鐓鐑嗘闂備浇顕у锕傦綖婢跺⊕娲晝閸屾氨顦梺缁樻⒒椤戞洟鍩€椤戣法顦﹂柍璇查叄楠炴ê鐣烽崶鑸敌濋梻鍌欒兌缁垶骞愰崫銉ㄥС闁割偅娲栫壕濠氭煙閸撗呭笡闁稿鍔戦弻娑樷槈濮楀牆濮涢梺鍛娚戦幃鍌氼潖濞差亜绀堥柟缁樺笂缁ㄨ偐绱撴担绛嬪殭閻庢凹鍓熼幃娲敇閻愨晜鏂€闂佺粯蓱閸撴岸宕箛娑欑厱闁挎繂楠搁悘锔筋殽閻愯尙绠婚柡浣规崌閺佹捇鏁撻敓锟�
婵犵數濮烽弫鍛婃叏閻戝鈧倿鎸婃竟鈺嬬秮瀹曘劑寮堕幋婵堚偓顓烆渻閵堝懐绠伴柣妤€妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛缁嬫帡鏁嶅澶嬬厽闁哄倹瀵чˉ鐐烘煙娓氬灝濡兼い顏勫暟閹风娀鐓鐑嗘闂傚倸鍊风粈渚€骞栭锔藉殣妞ゆ牜鍋涚粻鐘虫叏濡炶浜鹃悗瑙勬礃濡炰粙宕洪埀顒併亜閹哄秹妾峰ù婊勭矒閺岀喖宕崟顒夋婵炲瓨绮撶粻鏍ь潖閾忓厜鍋撻崷顓烆€岄柛銈嗙懇濮婅櫣鏁鍓滈梺缁樹緱閸o綁鐛€n喗鏅濋柍褜鍓涚划璇测槈閵忊檧鎷婚梺鍓插亞閸犳捇鍩婇弴鐔翠簻闁哄倹瀵чˉ銏℃叏婵犲嫮甯涢柟宄版嚇瀹曘劍绻濋崘銊ュ闂備浇顕х€涒晝鍠婂澶婄畺闁稿瞼鍋熷畵渚€鐓崶銊р姇闁哄懏鎮傞弻銊╂偆閸屾稑顏�
婵犵數濮烽弫鍛婃叏閻戝鈧倿鎸婃竟鈺嬬秮瀹曘劑寮堕幋婵堚偓顓烆渻閵堝懐绠伴柣妤€妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛缁嬫帡鏁嶅澶嬬厽闁哄倹瀵чˉ鐐烘煙娓氬灝濡兼い顏勫暟閹风娀鐓鐑嗘闂備浇顕у锕傦綖婢跺⊕娲煛閸愵亞顦繛鎾村焹閸嬫捇鏌e☉鍗炴灓闁逞屽墾缂嶅棙绂嶉弽顓炵哗濞寸姴顑嗛悡鏇熴亜閹伴潧浜滃ù婊勵殘缁辨帡骞夌€n偄顏�
濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴濐潟閳ь剙鍊圭粋鎺斺偓锝庝簽閸旓箑顪冮妶鍡楀潑闁稿鎹囬弻娑㈡偄闁垮浠撮梺绯曟杹閸嬫挸顪冮妶鍡楃瑨閻庢艾鍢茶灋闁瑰濮风壕濂稿级閸碍娅呭ù鐘崇矋閵囧嫰骞橀崘鍙夊€悗鍨緲鐎氼厾鎹㈠┑瀣妞ゆ挾鍋涚粻鎴︽⒒閸屾艾鈧兘鎳楅崼鏇炵疇闁瑰墽绮崑銈夋煏婵炑冨鎼村﹪姊洪崨濠冨闁搞劌銈稿顐﹀磼閻愭潙鈧灚绻涢幋鐑嗕痪闁兼祴鏅滃畷鏌ユ煕閳╁叇婊勭濠婂牊鐓涚€广儱娴烽崢娑欑箾閸喐鐓ユい顓″劵椤﹁尙鈧鍠栨晶搴ㄥ箲閵忕姭鏀介悗锝呭缁嬪繐顪冮妶鍡橆梿婵☆偄瀚伴、鏃堟晸閿燂拷
闂傚倸鍊搁崐宄懊归崶顒夋晪鐟滃酣銆冮妷鈺佺濞达絿枪閸嬪秴鈹戦悩璇у伐闁绘妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛娓氭宕曢幇鐗堢厱閻庯綆浜堕崕鏃堟煛瀹€鈧崰鏍嵁閸℃稒鍋嬮柛顐亝椤ュ姊绘担瑙勩仧闁告ü绮欓妴鍐川閺夋垹鍘撮梺纭呮彧闂勫嫰宕戦幇鐗堢厵缂備焦锚缁楁碍绻涢崼顐㈠籍婵﹦鍎ょ缓浠嬪川婵犲啴鏁紓鍌氬€哥粔鎾晝椤忓嫷鍤曞┑鐘宠壘鍥存繝銏f硾椤戝懎鈻撻悢鍏尖拺闂傚牊渚楀Σ鍫曟煕鎼淬劋鎲鹃柨婵堝仜椤撳吋寰勭€Q勫缂傚倸鍊烽悞锕€鐜婚幐搴g彾闁告洦鍘剧壕鐣屸偓骞垮劚鐎氼噣藝閿曞倹鐓熼柨婵嗘噹濡插鏌嶇拠鏌ュ弰妤犵偞岣块埀顒佺⊕钃辨い蹇曞枛濮婄粯鎷呴懞銉с€婇梺闈╃秶缁犳捇鐛箛娑欐櫢闁跨噦鎷�
UB闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗ù锝夋交閼板潡寮堕崼姘珔闁搞劍绻冮妵鍕冀椤愵澀绮剁紓浣插亾濠㈣泛顑勭换鍡涙煏閸繃鍣洪柛锝囨櫕閳ь剝顫夐幐椋庢濮樿泛钃熸繛鎴欏灩鍞梺闈涚箚閸撴繈鎮甸弴銏$厽閹兼番鍨婚。鑼偓鍏夊亾闁归棿绀佺粻鏍ㄤ繆閵堝倸浜鹃梺瀹犳椤︻垶鍩㈠澶嬫優妞ゆ劑鍨绘导宀勬⒑閹稿海绠橀柛瀣ㄥ€濆顐﹀箻缂佹ɑ娅㈤梺璺ㄥ櫐閹凤拷
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊閵娧呭骄闂佸壊鍋嗛崰鍡樼閸垻纾奸悗锝庡亽閸庛儲绻涢崗鑲╁ⅹ闁宠鍨块幃鈺佺暦閸ヨ埖娈归梻浣虹帛鐢紕绮婚弽顓炵畺婵°倕鎳忛崑銊╂煟閵忋垹浠柍褜鍓欓敃顏堝蓟濞戞埃鍋撻敐搴′簼鐎规洖鐭傞弻锝呪槈閸楃偞鐝濋悗瑙勬礀缂嶅﹪銆佸▎鎾崇煑闁靛/鍕剁础濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩绾惧鏌熼崜褏甯涢柣鎾卞劦閺岋綁寮撮悙娴嬪亾閸︻厸鍋撳鐐
闂傚倸鍊搁崐宄懊归崶顒夋晪鐟滃酣銆冮妷鈺佷紶闁靛/鍌滅憹闁诲骸绠嶉崕閬嵥囬鐐插瀭闁稿瞼鍋為悡鏇熺節闂堟稒顥滄い蹇曟暬閺屻倝寮堕幐搴′淮闂佸搫鏈惄顖涙叏閳ь剟鏌曡箛鏇炐fい鏃撴嫹
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸崹楣冨箛娴e湱绋佺紓鍌氬€烽悞锕佹懌闂佸憡鐟ョ换鎰扳€旈崘顏佸亾閿濆簼绨奸柟鐧哥悼缁辨帡鍩€椤掍胶绡€闁稿被鍊楅崬鐢告煟閻樿崵绱版繛鍜冪秮閹﹢鏌嗗鍡欏幈濠德板€撻懗鍫曘€傞懠顒傜<缂備焦岣垮ú瀵糕偓瑙勬礀瀹曨剝鐏冮梺閫炲苯澧存い銏☆殜婵偓闁靛牆妫涢崢閬嶆⒑缂佹ê濮囨俊顖氾工鍗遍柛锔诲幘绾捐偐绱撴担璐細闁靛棙甯炵槐鎺撴綇閵娧勫櫚闂佽鍠掗弲鐘茬暦椤愶箑绀嬫い鎰╁灱閸橆偊姊婚崒姘偓鐑芥嚄閼哥數浠氬┑掳鍊楁慨瀵告崲濮椻偓閻涱喛绠涘☉娆愭闂佽法鍣﹂幏锟�
缂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮撮悙娴嬪亾瑜版帒纾婚柨鐔哄У閻撱儵鏌¢崶鈺佷粶闁逞屽墯閹倸鐣疯ぐ鎺戠<婵炴垶姘ㄩ惁鍫熺節閻㈤潧孝闁稿﹥鎮傞、鏃堫敃閿濆啩绨婚梺鍐叉惈閹冲繘寮柆宥嗙厪闁搞儜鍐句純濡ょ姷鍋炵敮鎺楊敇婵傜ǹ鐐婇柤鍛婃櫕濠婂懐纾介柛灞剧懅閸斿秶鎲搁弶鍨殭闁挎洏鍨介弻鍡楊吋閸涱垰濮︽俊鐐€栫敮鎺楀磹閸涘﹦顩锋い鏍仦閻撴洖鈹戦悩鎻掓殶缂佺姵岣跨槐鎺撴綇閵婏箑纰嶅銈庡亝缁诲啴鏁嶉幇顑芥斀闁搞儯鍔嶉悵锕傛⒒閸屾瑦绁版繛澶嬫礋瀹曟娊鏁冮崒姘鳖唵闂佽法鍣﹂幏锟�
©2017 www.mb5u.com婵犵數濮烽弫鍛婃叏閻戝鈧倿鎸婃竟鈺嬬秮瀹曘劑寮堕幋婵堚偓顓烆渻閵堝懐绠伴柣妤€妫涚划鍫ュ醇閻旇櫣鐦堥梻鍌氱墛缁嬫帡鏁嶅澶嬬厽闁哄倹瀵чˉ鐐烘煙娓氬灝濡兼い顏勫暟閹风娀鐓鐑嗘闂備浇顕х€涒晠顢欓弽顓為棷妞ゆ洍鍋撶€规洘濞婇弫鎰緞婵犲嫮鏆梻浣稿暱閹碱偊骞婃惔锝囦笉闁汇垹鎲¢悡娆撴煟閹寸倖鎴犱焊椤撱垺鐓熼柨鏂垮悑鐎氾拷
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掆偓杩濋梺閫炲苯澧撮柡灞剧〒閳ь剨缍嗛崑鍛暦瀹€鍕厸鐎光偓閳ь剟宕伴弽顓溾偓浣糕槈濡嘲鐗氶梺鍛婂姉閸嬫挸袙婢跺绻嗛柣鎰典簻閳ь剚鍨垮畷鏇熺節濮橆剛顔嗛梺璺ㄥ櫐閹凤拷&闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫宥夊礋椤掍焦顔囬梻浣告贡閸庛倝宕甸敃鈧埥澶愬閻樼數娼夐梻浣稿閸嬪棝宕抽妷銉庢盯宕ㄧ€涙ǚ鎷洪柣鐘充航閸斿苯鈻嶉幇鐗堢厵闁告垯鍊栫€氾拷
QQ缂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕閻庢鍠氶弫濠氥€佸Δ鍛劦妞ゆ帒瀚ч埀顒佹瀹曟﹢顢欓挊澶屾濠电姰鍨归崢婊堝疾濠婂牊鍎庢い鏍仜閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈡晝閳ь剛澹曢崷顓犵=濞达綀鍋傞幋婵冩瀺闁绘ê鍘栫换鍡涙煏閸繂鈧憡绂嶉幆褜娓婚柕鍫濋娴滄繄绱掔拠鑼ⅵ闁靛棔绀侀埢搴ㄥ箣濠靛洨鈧娊姊洪崨濠庢畼闁稿鍋ら、娆撳磼濞戞绠氶梺缁樺姦娴滄粓鍩€椤掍胶澧い顐㈢箲缁绘繂顫濋鈧崑宥夋偡濠婂啰绠绘鐐差樀楠炴﹢顢欓懞銉︻仧闂備浇娉曢崳锕傚箯閿燂拷闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛顐f礀閸屻劎鎲搁弮鍫濈畺婵☆垯璀﹀ḿ鈺傘亜閹烘垵鈧懓鈻撻幆褉鏀芥い鏂款潟娴犳粓鏌涚€n偅灏伴柕鍥у婵偓闁挎稑瀚崳浼存倵鐟欏嫭绀€鐎规洦鍓濋悘鍐╃節閻㈤潧孝闁稿﹤缍婇、娆撳磼濞戞绠氶梺缁樺姦娴滄粓鍩€椤掍胶澧い顐㈢箲缁绘繂顫濋鈧崑宥夋偡濠婂啰绠绘鐐差樀楠炴﹢顢欓懞銉︻仧闂備浇娉曢崳锕傚箯閿燂拷濠电姷鏁告慨鐑藉极閹间礁纾绘繛鎴欏灪閸嬨倝鏌曟繛褍鍟悘濠囨椤愩垺澶勯柟灏栨櫅闇夐柡宥庡幗閻撳繐鈹戦悙鑼虎闁告挸澧介幉鍛婃償閳藉棗娈梺鍛婃处閸嬪棝寮抽崱娑欑厓鐟滄粓宕滃☉娆戠彾闁哄洨鍠嗛崑鍛存煕閹般劍娅囬柛娆忔濮婅櫣绱掑Ο鑽ゎ槬闂佺ǹ锕ゅ﹢閬嶅焵椤掍胶鍟查柟鍑ゆ嫹闂傚倸鍊峰ù鍥敋瑜忛埀顒佺▓閺呯娀銆佸▎鎾冲唨妞ゆ挾鍋熼悰銉╂⒑閸︻厼鍔嬫い銊ユ噽婢规洘绻濆顓犲幍闂佺顫夐崝鏇㈠触瑜版帗鐓曟繛鍡樺姈瀹曞矂鏌$仦鍓ф创濠碉紕鍏橀獮瀣攽閸℃ɑ顔夋繝鐢靛仜閻楀棙鏅舵惔锝嗩潟闁规崘顕х壕鍏兼叏濡顣抽柡瀣焸濮婃椽鎮烽弶鎸庮唨闂佺懓鍤栭幏锟�闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掍礁鍓銈嗗姧缁犳垹绮堢€n偁浜滈柟鎵虫櫅閻忊晝鎮鈧缁樻媴缁涘娈┑顔斤公缁犳捇鏁愰悙鏉戠窞閻庯綆鍓涢鏇熺節閻㈤潧孝婵炲眰鍔岄悾鍨瑹閳ь剟寮婚垾宕囨殼妞ゆ梻鎳撴禍楣冩⒑閸撴彃浜藉ù婊庝邯瀵鈽夐姀鐘靛姶闂佸憡鍔曢妵妯兼闂堟稈鏀介柍钘夋娴滈箖鏌熼崙銈嗗濠电姷鏁告慨鐑藉极閸涘﹥鍙忓ù鍏兼綑閸ㄥ倿鏌i幘宕囧哺闁哄鐗楃换娑㈠箣閻愬娈ら梺娲诲幗閹瑰洭寮婚悢铏圭<闁靛繒濮甸悘鍫ユ⒑閸濆嫬顏ラ柛搴″级缁岃鲸绻濋崶顬囨煕濞戝崬骞楁繛鍫濆缁辨帗銈i崘顏嗘毇缂備胶濮甸悧鐘差嚕婵犳碍鍋勯悶娑掆偓鍏呭濠电偞鍨堕悷锛勭磽濮樿京纾奸柣妯虹-婢ц京绱掓潏銊ョ闁归濮鹃ˇ鎶芥倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈠煕濮橆厽銇濋柡浣稿暣閸┾偓妞ゆ巻鍋撻柣婊冾煼瀹曞綊顢欑憴鍕偓濠氭⒑鐟欏嫬鍔ょ紒澶嬫綑鐓ゆい鎾卞灩閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓...