SAP接口编程之 NCo3.0之RfcDestination(转)
轉載地址: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的設計,所以相對來說比較成熟,給程序員提供更好的控制和方便性。
Nco3.0的優點
更加穩定、健壯、安全。關于安全,后面會有相關介紹。
重新設計SAP連接的處理方法:nco3.0程序員不需要自己去管理與SAP的連接(Connection),不需要打開連接、關閉連接、對象銷毀。所有這一切由.net connectior 3.0來管理。
增強對大交易數據(不是big data,是mass transactions或heavy load scenario)處理的能力
減少內存耗用
不綁定Visual Studio版本
.net connector 3.0下載和安裝
下載地址: https://service.sap.com/connectors。 安裝比較簡單,其實就是解壓,釋放幾個文件。我們在程序中主要使用sapnco.dll和sapnco_utils.dll這兩個動態鏈接庫。WIN7安裝(32位),默認的路徑是: C:Program Files (x86)SAPSAP_DotNetConnector3。
項目環境準備
1、項目添加引用:添加對sapnco.dll和sapnco_utils.dll的引用。
nco3-1-1.jpg
2、NCO3.0的namespace: nco3.0的namesapce只有一個:SAPP.Middleware.Connector,要在class中導入這個namespace
using SAP.Middleware.Connector;
RfcDestination
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則保證連接的安全性。
示例一
文件:RfcDestinationDemo.cs
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();
}
}
}
單元測試:
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();
}
}
}
示例2
定義一個類,實現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();
}
}
}
總結
以上是生活随笔為你收集整理的SAP接口编程之 NCo3.0之RfcDestination(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建jar文件
- 下一篇: 怎么识别datanode stale了?