首页 > 代码库 > .NET Remoting 分布式开发实例思想(转)
.NET Remoting 分布式开发实例思想(转)
实例开发
一个家用电器连锁店设有一个总部和许多分店,总部和分店以及各分店之间经常需要进行各种信息的查询(如:商品当日价目表、各店销售状况和库存信息等),对此组织机构建立分布式数据库查询系统,可实现总部和各店信息的共享,便于统一管理。
3.1 系统设计
3.1.1系统结构图
系统结构如图2所示:
图2 系统结构图
总部和各分店都配置了一台具有固定IP的服务器,其它电脑通过集线器与服务器相连,总部和各分店的服务器通过通信网络联接起来。 网管联盟www.bitsCN.com
3.1.2 系统实现步骤
网管网bitsCN_com
系统实现分为三个主要步骤。首先,为总部和各分店设计数据库。由于数据量较大,故采用SQL Server为每个分店创建销售和库存数据库,同时为总部创建员工数据库、整个连锁店的存货数据库、信用卡客户数据库以及供应商信息数据库等。其次,需要建立一个提供数据库服务(DbServer)的动态链接库(dll),将查询时所要用到的一些服务(如:远程对象的发布和获取等)和函数(如:本地异地数据表的查询、数据表的远程创建和删除、表间的连接和合并等)置入该dll中,各分店都需要使用这个dll,以便查询时对一些服务和函数进行调用。最后,根据实际需要开发客户端查询界面。 网管联盟www.bitsCN.com
3.2系统实现的关键技术
3.2.1 远程对象的发布与获取
系统运行后所要做的第一个工作是发布本地的远程对象并获取其它各店所发布的远程对象。发布远程对象时,首先要设置一个网络端口号,然后创建并注册一个通道,最后发布该服务器端的激活对象。其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象。实现远程对象发布和获取的关键代码如下:
远程对象的发布:
//创建一个通道实例,port为指定的网络端口号 TcpChannel MyChannel= new TcpChannel (Int32.Parse(port)); //注册通道 ChannelServices.RegisterChannel(MyChannel); //发布该服务器端激活对象 RemotingConfiguration.RegisterWellKnownServiceType( typeof ( DbServer ), "STORE", WellKnownObjectMode.Singleton); 远程对象的获取: //根据IP地址和端口号获取相应的远程对象 try {myDbServer=(DbServer)Activator.GetObject(typeof(DbServer),"tcp://"+ip+":"+p+"/STORE"); } //捕捉异常 catch( NullReferenceException nullExp ) {MessageBox.Show( "指定的url地址不可到达 " + nullExp.Message );} catch( RemotingException remExp ) {MessageBox.Show( "指定获得的对象定义不对" + remExp.Message );} 网管网bitsCN_com
3.2.2数据库的访问
通过ADO.Net访问数据库,可以方便地连接数据库,将数据源中的数据导入DataSet对象中,在DataSet对象中可对数据表进行各种操作,而且DataSet对象本身也可远程传递。这为开发分布式数据库系统带来极大方便。实现数据库访问的关键代码如下所示:
//建立数据库的连接 string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;"; SqlConnection Conn= new SqlConnection (SqlConn); Conn.Open();//打开数据库 //将数据源中的数据导入到数据集对象 try{ DataSet ds = new DataSet(); DataTable dt=new DataTable("Result"); SqlDataAdapter adapter=new SqlDataAdapter(); SqlCommand mySqlDataSetCmd =new SqlCommand (CmdString,Conn);//CmdString为要执行的命令 adapter.SelectCommand= mySqlDataSetCmd; adapter.Fill(dt); ds.Tables.Add(dt); } finally { Conn.Close();//关闭数据库的连接}
3.2.3 查询 com
分布式数据库系统中的查询一般分为三类:本地查询、远程查询和联合查询。本地查询和集中式数据库的查询没什么区别;对于远程查询,只要获取远程对象后,调用查询函数,即可方便地实现;最复杂的是联合查询,涉及到多场地之间数据的查询、表的远程创建、传递、连接、合并等技术。下面以实例介绍联合查询的实现。
第二连锁店要查询离其较近的第三、第四连锁店中所有北京的供应商所供应的空调的库存信息以便调货,可通过以下步骤实现。首先,获取总部以及第三、第四连锁店所发布的远程对象。接着,通过远程对象在总部创建一临时数据表t1,将查询到的所有北京的供应商信息存放在t1表中(各分店只有供应商名,并不知其所在地,只有总部才有供应商的详细信息),再将t1表保存到第三和第四连锁店。然后让t1表分别与两店的库存表作连接,找出所有北京供应商所供应的空调库存信息(如空调名称、型号、个数、价格等信息),并将连接结果t2和t3数据表返回到第二连锁店。最后对t2和t3两表进行合并,并使用DataGrid控件显示出来。上述实现中,包含了不同场地之间数据表的复制、传递、连接等,所用到的一些函数(如:远程创建数据表、表与表间的远程连接、合并等)都放在dll中,可以方便地调用。
.NET Remoting 分布式开发实例思想(转)