轉載地址:http://www.jianshu.com/p/5a5b4de5e1f1程序員
http://www.jianshu.com/u/fd37d4449963編程
進入新的系列:.net connector 3.0,簡稱Nco3.0。Nco3.0是SAP針對.net平臺提供的編程接口,由nco1.0/nco2.0演變而來。若是使用.net平臺編程,推薦使用nco3.0,3.0和以前1.0/2.0比較,無論是API仍是架構,都從新設計過,也借鑑了Jco3.0的設計,因此相對來講比較成熟,給程序員提供更好的控制和方便性。後端
下載地址: https://service.sap.com/connectors。 安裝比較簡單,其實就是解壓,釋放幾個文件。咱們在程序中主要使用sapnco.dll和sapnco_utils.dll這兩個動態連接庫。WIN7安裝(32位),默認的路徑是: C:\Program Files (x86)\SAP\SAP_DotNetConnector3。安全
一、項目添加引用:添加對sapnco.dll和sapnco_utils.dll的引用。架構
二、NCO3.0的namespace: nco3.0的namesapce只有一個:SAPP.Middleware.Connector,要在class中導入這個namespace單元測試
using SAP.Middleware.Connector;
RfcDestination表明後端SAP系統。以前SAP的接口技術對SAP系統通常使用Connection對象鏈接後端系統,nco3.0設計的一個重大改變就是程序員不用再關心SAP的鏈接,名稱也體現了這一點,如今叫Destination了。 RfcDestination對象的建立須要用RfcDestinationManager類的GetDestination方法,以保證只有一個Destination(單例模式)和安全:測試
// 方法一 public static RfcDestination GetDestination(RfcConfigParameters parameters); // 方法二 public static RfcDestination GetDestination(string destinationName);
方法1使用RfcConfigParameters做爲參數,這個參數包含必要的logon parameters。
方法2使用一個字符串做爲參數。必須定義一個類,實現IDestinationConfiguration接口,並實現IDestinationConfiguration接口的GetParameters()方法。在GetParameters方法中定義destinationName,RfcDestinationManager.GetDestination方法會自動調用GetParameters方法,獲取其中的logon parameters。程序員能夠在GetParameters方法中經過文件、UI界面多種方法填充logon parameters,從而賦予程序員較大的自由度,.net connector則保證鏈接的安全性。this
文件:RfcDestinationDemo.csspa
using SAP.Middleware.Connector; namespace Nco01 { public class RfcDestinationDemo { private RfcConfigParameters GetConfigParams() { RfcConfigParameters configParams = new RfcConfigParameters(); // Name property is neccessary, otherwise, NonInvalidParameterException will be thrown configParams.Add(RfcConfigParameters.Name, "ECC"); configParams.Add(RfcConfigParameters.AppServerHost, "192.168.65.100"); configParams.Add(RfcConfigParameters.SystemNumber, "00"); // instance number configParams.Add(RfcConfigParameters.SystemID, "D01"); configParams.Add(RfcConfigParameters.User, "STONE"); configParams.Add(RfcConfigParameters.Password, "xxx"); configParams.Add(RfcConfigParameters.Client, "001"); configParams.Add(RfcConfigParameters.Language, "EN"); configParams.Add(RfcConfigParameters.PoolSize, "5"); configParams.Add(RfcConfigParameters.MaxPoolSize, "10"); configParams.Add(RfcConfigParameters.IdleTimeout, "30"); return configParams; } public RfcDestination GetDestination() { RfcConfigParameters configParams = this.GetConfigParams(); RfcDestination dest = RfcDestinationManager.GetDestination(configParams); return dest; } public void PingDestination() { RfcDestination destination = this.GetDestination(); destination.Ping(); } } }
單元測試:.net
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Nco01; namespace UnitTestProject1 { [TestClass] public class TestRfcDestinationDemo { [TestMethod] public void TestPing() { RfcDestinationDemo rfc = new RfcDestinationDemo(); rfc.PingDestination(); } } }
定義一個類,實現IDestinationConfiguration接口,起始代碼以下:
DestinationConfig.cs
using System; using SAP.Middleware.Connector; namespace Nco01 { class DestinationConfig : IDestinationConfiguration { public bool ChangeEventsSupported() { throw new NotImplementedException(); } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; public RfcConfigParameters GetParameters(string destinationName) { throw new NotImplementedException(); } } }
將代碼改寫成下面這個樣子,填充destinationName爲ECC的logon parameters。
using System; using SAP.Middleware.Connector; namespace Nco01 { class DestinationConfig : IDestinationConfiguration { public bool ChangeEventsSupported() { return false; // 不支持ChangeEvent } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; public RfcConfigParameters GetParameters(string destinationName) { // get logon parameteres according to destinationName // the following is logon paramters for 'ECC' if ("ECC".Equals(destinationName)) { RfcConfigParameters configParams = new RfcConfigParameters(); configParams.Add(RfcConfigParameters.AppServerHost, "192.168.65.100"); configParams.Add(RfcConfigParameters.SystemNumber, "00"); // instance number configParams.Add(RfcConfigParameters.SystemID, "D01"); configParams.Add(RfcConfigParameters.User, "STONE"); configParams.Add(RfcConfigParameters.Password, "xxx"); configParams.Add(RfcConfigParameters.Client, "001"); configParams.Add(RfcConfigParameters.Language, "EN"); configParams.Add(RfcConfigParameters.PoolSize, "5"); configParams.Add(RfcConfigParameters.MaxPoolSize, "10"); configParams.Add(RfcConfigParameters.IdleTimeout, "30"); return configParams; } else { return null; } } } }
鏈接模塊代碼:
RfcDestinationUsingConfig.cs
using SAP.Middleware.Connector; namespace Nco01 { public class RfcDestUsingConfig { private RfcDestination destination; // initialize in constructor public RfcDestUsingConfig() { DestinationConfig destConfig = new DestinationConfig(); RfcDestinationManager.RegisterDestinationConfiguration(destConfig); destination = RfcDestinationManager.GetDestination("ECC"); } public RfcDestination GetConnection() { return destination; } public void PingDestination() { destination.Ping(); } } }
在構造器中初始化RfcDestination,搞得這麼複雜,主要就是安全緣由。根據ECC這個destinationName,自動調用DestinationConfig類的GetParameters方法,獲取logon parameters進行註冊,而後進行管理。程序員呢,只須要關心destination就行。
單元測試:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Nco01; namespace UnitTestProject1 { [TestClass] public class TestRfcDestinationDemo { [TestMethod] public void TestPing() { RfcDestinationDemo rfc = new RfcDestinationDemo(); rfc.PingDestination(); } } }