<script language="Javascript" type="text/javascript"></script>
另外,在分佈式數據庫系統中,還會經常遇到當用戶修改自從提取出來以來已經被修改的行時,違反一致性原則。對此問題ADO.Net也作了很好地解決,即使用DataSet對象爲每一條修改過的記錄維護兩個版本:原始版本和更新版本,在更新的記錄被寫回數據庫之前,先要把數據集中記錄的原始版本與數據庫中的當前版本進行比較,如果兩個版本匹配,就在數據庫中更新記錄;否則,就會出現違反一致性原則的錯誤。
3 實例開發
一個家用電器連鎖店設有一個總部和許多分店,總部和分店以及各分店之間經常需要進行各種信息的查詢(如:商品當日價目表、各店銷售狀況和庫存信息等),對此組織機構建立分佈式數據庫查詢系統,可實現總部和各店信息的共享,便於統一管理。
3.1 系統設計
3.1.1系統結構圖
系統結構如圖2所示:
圖2 系統結構圖
總部和各分店都配置了一臺具有固定IP的服務器,其它電腦通過集線器與服務器相連,總部和各分店的服務器通過通信網絡聯接起來。
3.1.2 系統實現步驟
系統實現分爲三個主要步驟。首先,爲總部和各分店設計數據庫。由於數據量較大,故採用SQL Server爲每個分店創建銷售和庫存數據庫,同時爲總部創建員工數據庫、整個連鎖店的存貨數據庫、信用卡客戶數據庫以及供應商信息數據庫等。其次,需要建立一個提供數據庫服務(DbServer)的動態鏈接庫(dll),將查詢時所要用到的一些服務(如:遠程對象的發佈和獲取等)和函數(如:本地異地數據表的查詢、數據表的遠程創建和刪除、表間的連接和合並等)置入該dll中,各分店都需要使用這個dll,以便查詢時對一些服務和函數進行調用。最後,根據實際需要開發客戶端查詢界面。
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 );} |
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 查詢
分佈式數據庫系統中的查詢一般分爲三類:本地查詢、遠程查詢和聯合查詢。本地查詢和集中式數據庫的查詢沒什麼區別;對於遠程查詢,只要獲取遠程對象後,調用查詢函數,即可方便地實現;最複雜的是聯合查詢,涉及到多場地之間數據的查詢、表的遠程創建、傳遞、連接、合併等技術。下面以實例介紹聯合查詢的實現。
第二連鎖店要查詢離其較近的第三、第四連鎖店中所有北京的供應商所供應的空調的庫存信息以便調貨,可通過以下步驟實現。首先,獲取總部以及第三、第四連鎖店所發佈的遠程對象。接着,通過遠程對象在總部創建一臨時數據表t1,將查詢到的所有北京的供應商信息存放在t1表中(各分店只有供應商名,並不知其所在地,只有總部纔有供應商的詳細信息),再將t1表保存到第三和第四連鎖店。然後讓t1表分別與兩店的庫存表作連接,找出所有北京供應商所供應的空調庫存信息(如空調名稱、型號、個數、價格等信息),並將連接結果t2和t3數據表返回到第二連鎖店。最後對t2和t3兩表進行合併,並使用DataGrid控件顯示出來。上述實現中,包含了不同場地之間數據表的複製、傳遞、連接等,所用到的一些函數(如:遠程創建數據表、表與表間的遠程連接、合併等)都放在dll中,可以方便地調用。
4 結束語
利用C#的.Net Remoting技術能夠方便地解決各場地間數據的通信問題。另外,C#通過ADO.Net訪問數據庫,使得對數據庫的操作及管理變得更加高效、可靠。這兩種技術的使用,有效地解決了開發分佈式數據庫系統的主要問題,大大減輕了系統開發工作量,並且提高了系統的可靠性和安全性。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2305749
- 訪問不同數據庫服務器中的數據庫對象 2005-12-03 ihwren
- DTS 用法學習 ZT 2004-12-13 dhz123
- JDBC數據庫連接池 2004-11-07 dahaidao
- .NET Remoting 實現分佈式數據庫查詢 2005-06-20 ZYF0808
- 數據庫基礎 2006-04-30 peiqin