自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET遠(yuǎn)程處理框架詳解

開發(fā) 后端
本文講述.NET遠(yuǎn)程處理框架,包括介紹遠(yuǎn)程對象部署在各個服務(wù)器端,客戶端除了實現(xiàn)查詢命令的解析和傳送外外,還有一個本地服務(wù)器,進(jìn)行相應(yīng)的本地查詢。

第1章 系統(tǒng)總體結(jié)構(gòu)

1.1 總體結(jié)構(gòu)

系統(tǒng)實現(xiàn)需要部署服務(wù)器端的遠(yuǎn)程對象(即一個DbServerLibrary.dll),服務(wù)器端要注冊通道和該遠(yuǎn)程對象??蛻舳艘獙崿F(xiàn)一個本地查詢的服務(wù)器,同時根據(jù)SQL解析的結(jié)果向各個服務(wù)器發(fā)送命令,并將結(jié)果顯示在客戶端界面,服務(wù)器端可以接受并顯示相應(yīng)的命令。

1.2 關(guān)鍵組件結(jié)構(gòu)

系統(tǒng)結(jié)構(gòu)中關(guān)鍵的組件有遠(yuǎn)程對象,和本地服務(wù)器,實現(xiàn)的功能基本一致。下面以遠(yuǎn)程對象為例,說明組件的實現(xiàn)。遠(yuǎn)程對象在服務(wù)器端解決方案下的庫文件中聲明,通過服務(wù)器端進(jìn)行注冊,客戶端通過TCP通道與服務(wù)器端遠(yuǎn)程對象通信,實現(xiàn)數(shù)據(jù)集的查詢和傳輸。主要的數(shù)據(jù)成員有:SqlConnection(SQL Server數(shù)據(jù)庫的連接對象)、 SqlCommand (SQL命令對象)、SqlDataAdapter(數(shù)據(jù)適配器,填充數(shù)據(jù)集)組件——DbServerLibrary。

第2 章 .NET遠(yuǎn)程處理框架提供的強大技術(shù)

因時間倉促,未實現(xiàn)數(shù)據(jù)字典,所有實驗要求的SQL經(jīng)過解析后,直接通過代碼判斷,向相應(yīng)場地發(fā)送命令。

代碼分為三部分:遠(yuǎn)程對象,服務(wù)器端代碼和客戶端代碼。

其中:遠(yuǎn)程對象部署在各個服務(wù)器端,客戶端除了實現(xiàn)查詢命令的解析和傳送外外,還有一個本地服務(wù)器,進(jìn)行相應(yīng)的本地查詢。

遠(yuǎn)程對象代碼:

  1. usingSystem;  
  2. usingSystem.Runtime.Serialization;  
  3. usingSystem.Data;  
  4. usingSystem.Data.SqlClient;  
  5. usingSystem.Windows.Forms;  
  6. namespaceDbServerLibrary{  
  7. [SerializableAttribute]//ItisveryimportantforRemotingData  
  8. publicclassDbServer:MarshalByRefObject{  
  9. privatestringconnStr;  
  10. privatestringclientSql;  
  11. publicSqlConnectionsqlConn;  
  12. publicSqlCommandsqlComm;  
  13. publicSqlDataAdaptersqlAdapter;  
  14. publicvoidGetClientSql(stringsql){  
  15. if(clientSql!=null){  
  16. clientSql=null;  
  17. }  
  18. clientSql=sql;  
  19. MessageBox.Show(clientSql);  
  20. }  
  21. publicDbServer(){  
  22. //LocalDataInitialize  
  23. cnnStr="DataSource=localhost;InitialCatalog=DDB;UserID=sa;Password=;";  
  24. sqlConn=newSqlConnection(connStr);  
  25. }  
  26. publicDataSetGetDataSet()  
  27. //執(zhí)行select  
  28. DataSetds=newDataSet();  
  29. if(sqlComm!=null){  
  30. sqlComm=null;  
  31. }  
  32. if(sqlConn.State==ConnectionState.Closed){  
  33. sqlConn.Open();  
  34. }  
  35. try{  
  36. sqlComm=newSqlCommand();  
  37. sqlComm.Connection=sqlConn;  
  38. sqlComm.CommandText=clientSql;  
  39. sqlComm.CommandType=CommandType.Text;  
  40. sqlAdapter=newSqlDataAdapter();  
  41. sqlAdapter.SelectCommand=sqlComm;  
  42. sqlAdapter.Fill(ds);  
  43. }  
  44. catch(SqlExceptionex){  
  45. MessageBox.Show(ex.Message);  
  46. }  
  47. returnds;  
  48. }  
  49. publicintExecuteSql()//執(zhí)行insert和delete{  
  50. intaffectedNumber;  
  51. if(sqlComm!=null){  
  52. sqlComm=null;  
  53. }  
  54. if(sqlConn.State==ConnectionState.Closed){  
  55. sqlConn.Open();  
  56. }  
  57. try{  
  58. sqlComm=newSqlCommand();  
  59. sqlComm.Connection=sqlConn;  
  60. sqlComm.CommandType=CommandType.Text;  
  61. sqlComm.CommandText=clientSql;  
  62. affectedNumber=sqlComm.ExecuteNonQuery();  
  63. returnaffectedNumber;  
  64. }  
  65. catch(SqlExceptionex){  
  66. MessageBox.Show(ex.Message);  
  67. return0;  
  68. }  
  69. }  
  70. }  

服務(wù)器端代碼:

  1. privatevoidfrmSupplierServer_Load(objectsender,System.EventArgse)  
  2. {TcpChannelchan=newTcpChannel(8888);  
  3. ChannelServices.RegisterChannel(chan);  
  4. //注冊提供服務(wù)的遠(yuǎn)程對象  
  5. RemotingConfiguration.RegisterWellKnownServiceType(typeof(DbServerLibrary.DbServer)
    "DbServer",WellKnownObjectMode.Singleton);  

 客戶端代碼:

解析SQL:SqlParse.cs

  1. namespaceSupplierClient{  
  2. publicclassSqlParse{  
  3. //得到sql語句的類型  
  4. publicstringGetSqlType(stringsqlText)//typeofSQLstatements{  
  5. }  
  6. //得到select語句要查詢的表名  
  7. publicstringGetSelectTableName(stringsqlText){  
  8. }  
  9. //得到select語句中的where子句  
  10. publicstringGetWhereClause(stringsqlText){  
  11. }  
  12. //得到查詢條件中的字段名  
  13. publicstringGetSelectField(stringsqlText){  
  14. }  
  15. //得到分片依據(jù),返回Scity的值  
  16. publicstringGetSelectCityValue(stringsqlText){  
  17. }  
  18. //設(shè)定select語句經(jīng)解析后的格式  
  19. publicArrayListSetSelectList(stringsqlText){  
  20. }  
  21. //如果沒有分片信息,則向3個場地都發(fā)送命令  
  22. publicArrayListSendToAllSite(stringsqlText){  
  23. }  
  24. //得到insert語句要查詢的表名  
  25. publicstringGetInsertTableName(stringsqlText){  
  26. }  
  27. //根據(jù)插入的表和值,設(shè)定場地:INSERTINTOSupplierVALUES('no','name','city'),returncity  
  28. publicstringGetInsertCityValue(stringsqlText){  
  29. }  
  30. //如果表名是Supplier,則根據(jù)city值設(shè)定向哪個場地發(fā)送命令  
  31. publicArrayListSetInsertSite(stringsqlText){  
  32. }  
  33. //生成解析后的insert命令列表  
  34. publicArrayListSetInsertList(stringsqlText){  
  35. }  
  36. namespaceSupplierClient{  
  37. publicclassLocalServer{  
  38. }  
  39. //返回查詢結(jié)果  
  40. publicDataSetMakeDataSet(stringsqlText){  
  41. }  
  42. //執(zhí)行插入和刪除操作,并返回影響記錄數(shù)  
  43. publicintExecuteSql(stringsqlText){  

第4 章 界面

4.1 客戶端

客戶端啟動后,用戶首先在文本框中輸入SQL命令,然后通過解析后向相應(yīng)場地發(fā)送命令,并將返回的結(jié)果集進(jìn)行合并,顯示在界面中,顯示結(jié)果后空白的文本框用來顯示執(zhí)行插入刪除操作時的結(jié)果信息。

4.2 服務(wù)器

服務(wù)器端僅實現(xiàn)對遠(yuǎn)程對象的注冊,因此界面不需要實現(xiàn)功能,只需要在啟動時注冊遠(yuǎn)程對象即可,接收到的客戶端的用戶命令是通過消息框顯示的。如上圖所示。

第5 章 命令處理及核心算法流程

Insert 操作——

  1. //得到insert語句要查詢的表名  
  2. publicstringGetInsertTableName(stringsqlText){  
  3. }  
  4. //根據(jù)插入的表和值,設(shè)定場地:INSERTINTOSupplierVALUES('no','name','city'),returncity  
  5. publicstringGetInsertCityValue(stringsqlText){  
  6. }  
  7. //如果表名是Supplier,則根據(jù)city值設(shè)定向哪個場地發(fā)送命令  
  8. publicArrayListSetInsertSite(stringsqlText){  
  9. }  
  10. //生成解析后的insert命令列表  
  11. publicArrayListSetInsertList(stringsqlText){  

Delete 操作——

向各個場地發(fā)送,通過定義數(shù)據(jù)庫中表的關(guān)系及約束來保證完整性和一致性,如果刪除命令不成功,則返回異常信息,否則,返回各個場地成功執(zhí)行命令影響的記錄數(shù)目。

Select 操作——

  1. //得到sql語句的類型  
  2. publicstringGetSqlType(stringsqlText)//typeofSQLstatements{  
  3. }  
  4. //得到select語句要查詢的表名  
  5. publicstringGetSelectTableName(stringsqlText){  
  6. }  
  7. //得到select語句中的where子句  
  8. publicstringGetWhereClause(stringsqlText){  
  9. }  
  10. //得到查詢條件中的字段名  
  11. publicstringGetSelectField(stringsqlText){  
  12. }  
  13. //得到分片依據(jù),返回Scity的值  
  14. publicstringGetSelectCityValue(stringsqlText){  
  15. }  
  16. //設(shè)定select語句經(jīng)解析后的格式  
  17. publicArrayListSetSelectList(stringsqlText){  
  18. }  
  19. //如果沒有分片信息,則向3個場地都發(fā)送命令  
  20. publicArrayListSendToAllSite(stringsqlText){  

第6章 結(jié)論

.NET遠(yuǎn)程處理框架提供的一項強大的技術(shù),利用它可以使位于任何位置的應(yīng)用程序互相通信,這些應(yīng)用程序可能在同一臺計算機上運行,也可能位于同一局域網(wǎng)中的不同計算機上,或者位于相隔萬里的有巨大差異的網(wǎng)絡(luò)中。

使用.NET Remoting技術(shù)結(jié)合ADO.Net能夠高效、可靠地解決這兩方面的問題。具體表現(xiàn)為,在C#中通過使用.Net遠(yuǎn)程處理框架能夠方便地解決數(shù)據(jù)、命令遠(yuǎn)程傳遞問題;C#通過ADO.Net對數(shù)據(jù)庫進(jìn)行操作,使分布式數(shù)據(jù)庫系統(tǒng)中對數(shù)據(jù)庫的各種操作變得高效、可靠,同時易于解決數(shù)據(jù)一致性問題。

由于時間關(guān)系,程序中仍有部分bug,將在下一步繼續(xù)完善,而且,還應(yīng)進(jìn)一步完善數(shù)據(jù)字典,使程序結(jié)構(gòu)更加清晰,增強可擴充性。

【編輯推薦】

  1. .NET 3.5擴展方法點評:優(yōu)點與問題
  2. 一個.NET調(diào)用PHP Web Service的典型例子
  3. .NET 4.0的ICustomQueryInterface新特性
  4. 在.NET反應(yīng)性框架中實現(xiàn)LINQ
  5. .NET 3.5擴展方法和Lambda表達(dá)式
責(zé)任編輯:彭凡 來源: 51CTO博客
相關(guān)推薦

2010-01-05 10:29:43

.NET Framew

2010-07-02 09:25:37

.NET 4.0可擴展

2010-04-14 09:20:26

.NET多線程

2009-11-12 14:55:16

ADO.NET實體框架

2024-02-06 09:12:55

Dapper.NETORM框架

2010-09-15 09:18:21

ASP.NET MVC

2010-01-05 09:26:13

.NET 4.0

2010-01-13 17:23:36

VB.NET動態(tài)事件

2013-08-22 17:10:09

.Net異常處理

2009-04-09 14:42:19

ASP.NETLINQ數(shù)據(jù)庫

2010-10-09 08:41:40

Mono 2.8

2009-08-06 17:25:07

.NET框架基本要求

2009-07-24 13:20:44

MVC框架ASP.NET

2009-09-01 16:08:27

.NET框架

2012-06-25 12:43:26

.NET框架

2009-07-28 16:57:50

ASP.NET Ses

2009-07-22 16:25:41

ASP.NET AJA

2009-07-24 10:14:22

ASP.NET開發(fā)

2009-08-05 11:14:33

ASP.NET ISA

2010-01-06 18:27:06

.Net Framew
點贊
收藏

51CTO技術(shù)棧公眾號