• C#通过RFC调用SAP


    using System;
    using System.Collections.Generic;
    using
    SAP.Middleware.Connector;
    using System.Data;
    using
    System.Xml;

    namespace RFC
    {

    ///
    /// C#与SAP的RFC接口类

    ///
    public class RFCInterface

    {
    #region
    初始化

    ///
    ///
    初始化SRM-RFC类

    ///
    ///
    PRD_000为500系统,PRD_001为300系统
    public
    RFCInterface(string
    destinationName)

    {
    DestName
    =
    destinationName;

    //RfcDest =
    GetDestination(DestName);


    ID = new MyBackendConfig();
    //实例化IDestinationConfiguration

    }

    #endregion

    #region
    数据定义
    private RfcDestination
    rfcDest;

    protected
    RfcDestination RfcDest

    {

    get

    {

    if (rfcDest == null && DestName !=
    null)

    {

    this.Connect();

    return
    rfcDest;

    }

    else

    {

    return
    rfcDest;

    }


    }
    set {
    rfcDest = value; }

    }

    ///
    ///
    DestinationName,用来选择不同的连接参数

    ///
    private string
    destName;

    protected string
    DestName

    {
    get {
    return destName;
    }
    set {
    destName = value; }

    }


    IDestinationConfiguration ID;

    #endregion

    #region
    管理RfcDestination连接

    ///
    ///
    建立RFC连接

    ///
    public void
    Connect()

    {

    RfcDestinationManager.RegisterDestinationConfiguration(ID);

    RfcDest =
    RfcDestinationManager.GetDestination(DestName);

    }

    ///
    ///
    断开RFC连接

    ///
    public void
    DisConnect()

    {

    RfcDestinationManager.UnregisterDestinationConfiguration(ID);

    }

    #endregion

    #region
    从SAP读取数据

    ///
    ///
    从SAP按Table读取数据

    ///
    ///
    函数名称
    ///
    表格名称
    ///
    表格列名
    ///
    数据表
    public DataTable
    ReadTableFromSAP(string functionName, string tableName, List
    columnNames)

    {

    RfcRepository repo =
    RfcDest.Repository;

    IRfcFunction functionBapi = repo.CreateFunction(functionName);
    //调用函数名


    functionBapi.Invoke(RfcDest);
    //执行函数

    IRfcTable table = functionBapi.GetTable(tableName);
    //获取相应的品号内表


    DataTable dt = new DataTable();
    //新建表格


    //增加表的列

    foreach (string colName in
    columnNames)

    {

    dt.Columns.Add(colName);
    //表格添加一列

    }

    for
    (int i = 0; i < table.RowCount;
    i++)

    {

    table.CurrentIndex = i;
    //当前内表的索引行

    DataRow dr =
    dt.NewRow();

    foreach (string colName in
    columnNames)

    {

    dr[colName] = table.GetString(colName);
    //给表格赋值

    }


    dt.Rows.Add(dr);
    //填充该表格的值

    }


    //prd =
    null;
    repo
    =
    null;


    return dt;

    }

    ///
    ///
    从SAP按Table读取数据

    ///
    ///
    函数名称
    ///
    表格名称
    ///
    表格列名
    ///
    传入参数
    ///
    数据表
    public DataTable
    ReadTableFromSAP(string functionName, string tableName, List columnNames, List
    inParams)

    {

    RfcRepository repo =
    RfcDest.Repository;

    IRfcFunction functionBapi = repo.CreateFunction(functionName);
    //调用函数名


    //设置Import的参数

    foreach (RFCInParameter inParam in
    inParams)

    {

    functionBapi.SetValue(inParam.ParameterName,
    inParam.ParameterValue);

    }


    functionBapi.Invoke(RfcDest);
    //执行函数

    IRfcTable table = functionBapi.GetTable(tableName);
    //获取相应的品号内表


    DataTable dt = new DataTable();
    //新建表格


    //增加表的列

    foreach (string colName in
    columnNames)

    {

    dt.Columns.Add(colName);
    //表格添加一列

    }

    for
    (int i = 0; i < table.RowCount;
    i++)

    {

    table.CurrentIndex = i;
    //当前内表的索引行

    DataRow dr =
    dt.NewRow();

    foreach (string colName in
    columnNames)

    {

    dr[colName] = table.GetString(colName);
    //给表格赋值

    }


    dt.Rows.Add(dr);
    //填充该表格的值

    }


    //prd =
    null;
    repo
    =
    null;


    return dt;

    }

    #endregion

    #region
    写回数据到SAP

    ///
    ///
    将结果表返回给SAP

    ///
    ///
    Function名称
    ///
    返回表名
    ///
    需返回的数据表,表名需和SAP列名相同
    ///
    成功返回True,失败False
    public bool
    WriteTableToSAP(string functionName, string tableName, DataTable
    dt)

    {
    if (dt
    != null)

    {

    //对空的DataTable直接返回真

    if (dt.Rows.Count ==
    0)

    {

    return
    true;

    }

    try

    {

    int intSL = 10000;
    //一次同步数量

    int intRowNumber =
    dt.Rows.Count;

    int intCS, intYS, intCount; //循环次数,剩余数量,
    循环时处理数量

    intCS = System.Convert.ToInt32(intRowNumber / intSL) +
    1;
    //分批处理次数

    intYS = intRowNumber %
    intSL;
    //最后执行数量


    RfcRepository repo =
    rfcDest.Repository;

    IRfcFunction funBapi = repo.CreateFunction(functionName);
    //调用函数名


    IRfcTable tblROF = funBapi.GetTable(tableName);
    //获取相应的表

    int k =
    0;


    for (int j = 0; j < intCS;
    j++)

    {

    intCount = (j == intCS - 1 ? intYS :
    intSL);


    tblROF.Clear();


    for (int i = 0; i < intCount;
    i++)

    {

    tblROF.Insert();

    for (int m = 0; m < dt.Columns.Count;
    m++)

    {

    tblROF.CurrentRow.SetValue(dt.Columns[m].ColumnName,
    dt.Rows[k][m].ToString());

    }


    k++;

    }


    funBapi.SetValue(tableName,
    tblROF);


    funBapi.Invoke(rfcDest);
    //提交

    }

    //引用回传结果

    //IRfcTable RETURNStructure =
    funBapi.GetTable("RETURN");

    //显示调用结果

    //MessageBox.Show(RETURNStructure.GetString("MESSAGE").ToString());


    // prd =
    null;

    repo =
    null;


    return
    true;

    }

    catch

    {

    return
    false;

    }

    }

    else

    {

    return
    false;

    }

    }

    ///
    ///
    回写数据表到SAP

    ///
    ///
    RFC函数名
    ///
    SAP数据表名
    ///
    回传数据表
    ///
    SAP表列名,需与回传表保持一致

    ///
    public bool
    WriteTableToSAP(string functionName, string tableName, DataTable dt, List
    SAPColumnNames)

    {
    if
    (SAPColumnNames.Count !=
    dt.Columns.Count)

    {

    return
    false;

    }
    else if
    (dt !=
    null)

    {

    try

    {

    int intRowNumber =
    dt.Rows.Count;

    int intCS, intYS, intCount; //循环次数,剩余数量,
    循环时处理数量

    intCS = System.Convert.ToInt32(intRowNumber / 10000) +
    1;
    //分批处理次数

    intYS = intRowNumber %
    10000;
    //最后执行数量


    RfcRepository repo =
    rfcDest.Repository;

    IRfcFunction funBapi = repo.CreateFunction(functionName);
    //调用函数名


    IRfcTable tblROF = funBapi.GetTable(tableName);
    //获取相应的表

    int k =
    0;


    for (int j = 0; j < intCS;
    j++)

    {

    intCount = (j == intCS - 1 ? intYS :
    10000);


    tblROF.Clear();


    for (int i = 0; i < intCount;
    i++)

    {

    tblROF.Insert();

    for (int m = 0; m < dt.Columns.Count;
    m++)

    {

    tblROF.CurrentRow.SetValue(SAPColumnNames[m],
    dt.Rows[k][m].ToString());

    }


    k++;

    }


    funBapi.SetValue(tableName,
    tblROF);


    funBapi.Invoke(rfcDest);
    //提交

    }

    //引用回传结果

    //IRfcTable RETURNStructure =
    funBapi.GetTable("RETURN");

    //显示调用结果

    //MessageBox.Show(RETURNStructure.GetString("MESSAGE").ToString());


    // prd =
    null;

    repo =
    null;


    return
    true;

    }

    catch

    {

    return
    false;

    }

    }

    else

    {

    return
    false;

    }

    }


    #endregion
    }

    #region
    RFC传入参数
    ///
    ///
    RFC传入参数
    ///
    public struct
    RFCInParameter

    {

    ///
    ///
    参数名称

    ///
    string
    parameterName;

    ///
    ///
    参数值

    ///
    string
    parameterValue;

    public string
    ParameterName

    {
    get {
    return parameterName;
    }
    set {
    parameterName = value; }

    }

    public string
    ParameterValue

    {
    get {
    return parameterValue;
    }
    set {
    parameterValue = value; }

    }
    public RFCInParameter(string
    paramName, string paramValue)

    {

    parameterName =
    paramName;

    parameterValue = paramValue;

    }
    }

    #endregion

    #region
    Destination参数类
    ///
    ///
    destination参数类
    ///
    public class
    RFCDestinationParameter

    {
    private string
    paramName;
    //参数名称

    private string appServerHost;

    private string systemNumber;

    private string user;
    private
    string password;
    private string
    client;
    private string
    language;
    private string
    poolsize;
    private string
    maxpoolsize;
    private string
    idleTimeout;

    public string
    ParamName

    {
    get {
    return paramName;
    }
    set {
    paramName = value; }

    }
    public string
    AppServerHost

    {
    get {
    return appServerHost;
    }
    set {
    appServerHost = value; }

    }
    public string
    SystemNumber

    {
    get {
    return systemNumber;
    }
    set {
    systemNumber = value; }

    }
    public string
    User

    {
    get {
    return user;
    }
    set {
    user = value; }

    }
    public string
    Password

    {
    get {
    return password;
    }
    set {
    password = value; }

    }
    public string
    Client

    {
    get {
    return client;
    }
    set {
    client = value; }

    }
    public string
    Language

    {
    get {
    return language;
    }
    set {
    language = value; }

    }
    public string
    Poolsize

    {
    get {
    return poolsize;
    }
    set {
    poolsize = value; }

    }
    public string
    Maxpoolsize

    {
    get {
    return maxpoolsize;
    }
    set {
    maxpoolsize = value; }

    }
    public string
    IdleTimeout

    {
    get {
    return idleTimeout;
    }
    set {
    idleTimeout = value; }

    }

    public
    RFCDestinationParameter()

    {

    }

    public
    RFCDestinationParameter(string serverHost, string systemNumber, string user,
    string password, string client, string language, string poolsize, string
    maxpoolsize, string idleTimeout)

    {

    AppServerHost =
    serverHost;

    SystemNumber =
    systemNumber;

    User =
    user;

    Password =
    password;

    Client =
    client;

    Language =
    language;

    Poolsize =
    poolsize;

    Maxpoolsize =
    maxpoolsize;

    IdleTimeout = idleTimeout;

    }
    }

    #endregion

    #region 读取配置类

    ///
    /// 参数配置类

    ///
    public static class RFCConfig

    {
    private static string
    configFileName = string.Empty;


    public static string
    ConfigFileName

    {
    get {
    return configFileName;
    }
    set {
    configFileName = value; }

    }

    #region
    读取XML参数

    //读取RFC配置文件
    public static List
    ReadRFCConfig()

    {
    //string
    xmlName = System.Environment.CurrentDirectory +
    @"RFCConfig.xml";

    if (ConfigFileName ==
    string.Empty)

    {

    ConfigFileName = System.Environment.CurrentDirectory +
    @"RFCConfig.xml";

    }
    return
    ReadRFCConfig(ConfigFileName);

    }


    ///
    ///
    读取RFC配置文件

    ///
    ///
    配置文件名称

    ///
    private static List
    ReadRFCConfig(string configName)

    {
    if
    (System.IO.File.Exists(configName))

    {

    XmlDocument doc = new
    XmlDocument();

    doc.Load(configName);
    //读取XML文件


    List destParams = new
    List();


    XmlNodeList dests =
    doc.SelectNodes("/configuration/SAP.Middleware.Connector/ClientSettings/DestinationConfiguration/destinations/add");

    if (dests !=
    null)

    {

    foreach (XmlNode destParam in
    dests)

    {

    //paramNames.Add(destParam.Attributes["name"].Value);

    RFCDestinationParameter rfcDestParam = new
    RFCDestinationParameter();

    rfcDestParam.ParamName =
    destParam.Attributes["NAME"].Value;

    rfcDestParam.AppServerHost =
    destParam.Attributes["ASHOST"].Value;

    rfcDestParam.User =
    destParam.Attributes["USER"].Value;

    rfcDestParam.Password =
    destParam.Attributes["PASSWD"].Value;

    rfcDestParam.Client =
    destParam.Attributes["CLIENT"].Value;

    rfcDestParam.Language =
    destParam.Attributes["LANG"].Value;

    rfcDestParam.SystemNumber =
    destParam.Attributes["SYSNR"].Value;

    rfcDestParam.Maxpoolsize =
    destParam.Attributes["MAX_POOL_SIZE"].Value;

    rfcDestParam.Poolsize =
    destParam.Attributes["POOL_SIZE"].Value;

    rfcDestParam.IdleTimeout =
    destParam.Attributes["IDLE_TIMEOUT"].Value;


    destParams.Add(rfcDestParam);

    }

    }


    return
    destParams;

    }

    else

    {

    return
    null;

    }

    }
    #endregion

    }
    #endregion

    #region
    登录参数设置类
    ///
    ///
    登录参数设置
    ///
    public class
    MyBackendConfig : IDestinationConfiguration

    {


    public
    RfcConfigParameters GetParameters(String
    destinationName)

    {
    List
    rfcDestParams =
    RFCConfig.ReadRFCConfig();


    foreach (RFCDestinationParameter destParam in
    rfcDestParams)

    {

    if (destParam.ParamName.Equals(destinationName,
    StringComparison.OrdinalIgnoreCase))

    {

    RfcConfigParameters parms = new
    RfcConfigParameters();

    parms.Add(RfcConfigParameters.AppServerHost,
    destParam.AppServerHost);
    //SAP主机IP

    parms.Add(RfcConfigParameters.SystemNumber, destParam.SystemNumber);
    //SAP实例

    parms.Add(RfcConfigParameters.User, destParam.User);
    //用户名

    parms.Add(RfcConfigParameters.Password, destParam.Password);
    //密码

    parms.Add(RfcConfigParameters.Client, destParam.Client); //
    Client

    parms.Add(RfcConfigParameters.Language, destParam.Language);
    //登陆语言

    parms.Add(RfcConfigParameters.PoolSize,
    destParam.Poolsize);

    parms.Add(RfcConfigParameters.MaxPoolSize,
    destParam.Maxpoolsize);

    parms.Add(RfcConfigParameters.IdleTimeout,
    destParam.IdleTimeout);

    return
    parms;

    }

    }


    return null;

    }
    public bool
    ChangeEventsSupported()

    {
    return
    false;

    }
    public event
    RfcDestinationManager.ConfigurationChangeHandler
    ConfigurationChanged;
    }

    #endregion
    }

  • 相关阅读:
    C++ 虚函数在基类与派生类对象间的表现及其分析
    借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取
    Dede(织梦) CMS SQL Injection Vulnerability
    dedecms v5.5 final getwebshell exploit(datalistcp.class.php)
    DEDECMS网站管理系统Get Shell漏洞
    织梦(Dedecms)select_soft_post.php页面变量未初始漏洞
    织梦(Dedecms) 5.1 feedback_js.php 注入漏洞
    织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞
    dedecms织梦 v5.5 两处跨站漏洞
    dedecms织梦 v5.6 两处跨站漏洞
  • 原文地址:https://www.cnblogs.com/jamin/p/3374137.html
Copyright © 2020-2023  润新知