zoukankan      html  css  js  c++  java
  • .NET利用RFC连接SAP,查询、读取SAP数据

    为黄朴整理!!!!!!!!!!!!!!!!!

    在NuGet 添加 sapnco

    一个简单的SAPCommand,方法 GetDataTableFromRFCTable 复制于 https://www.cnblogs.com/jamin/p/3374139.html

    using System;
    using System.Collections.Generic;
    using System.Text;
    using SAP.Middleware.Connector;
    using System.Data;
    using System.Linq;
    namespace Blog.Core.Business.RFC
    {
        /// <summary>
        /// SAPCommand
        /// </summary>
        public static class SAPCommand
        {
            /// <summary>
            /// 获取连接SAP参数
            /// </summary>
            /// <returns></returns>
            private static RfcConfigParameters GetRfcConfigParameters()
            {
                RfcConfigParameters pairs = new RfcConfigParameters();
                pairs.Add(RfcConfigParameters.Name, "SAP连接名");
                pairs.Add(RfcConfigParameters.AppServerHost, "SAP服务器地址");
                pairs.Add(RfcConfigParameters.SystemNumber, "00");
                pairs.Add(RfcConfigParameters.SystemID, "D01");
                pairs.Add(RfcConfigParameters.User, "SAP账号");
                pairs.Add(RfcConfigParameters.Password, "SAP密码");
                pairs.Add(RfcConfigParameters.Client, "客户端");
                pairs.Add(RfcConfigParameters.Language, "en");
                pairs.Add(RfcConfigParameters.PoolSize, "5");
                pairs.Add(RfcConfigParameters.MaxPoolSize, "10");
                pairs.Add(RfcConfigParameters.IdleTimeout, "30");
                return pairs;
            }
    
            /// <summary>
            /// 获取SAP连接
            /// </summary>
            /// <returns></returns>
            private static RfcDestination GetRfcDestination()
            {
                RfcDestination destination = RfcDestinationManager.GetDestination(GetRfcConfigParameters());
                return destination;
            }
    
            /// <summary>
            /// Get SAP Datatable Info
            /// </summary>
            /// <param name="rfcFuctionName">SAP Function Module</param>
            /// <param name="rfcTableName">SAP Function Group</param>
            /// <param name="keyValues">SAP所需参数</param>
            /// <returns>DataTable</returns>
            public static DataTable GetDatatableFromSAP(string rfcFuctionName, string rfcTableName, Dictionary<string, object> keyValues = null) =>
                GetDataSetFromSAP(rfcFuctionName, new List<string> { rfcTableName }, keyValues)[rfcTableName];
    
            /// <summary>
            /// Get SAP DataSet Info(SAP返回多个表)
            /// </summary>
            /// <param name="rfcFuctionName">SAP Function Module</param>
            /// <param name="rfcTableNameList">SAP Function Groups</param>
            /// <param name="keyValues">SAP所需参数</param>
            /// <returns>Dictionary<string ,DataTable></returns>
            public static Dictionary<string ,DataTable> GetDataSetFromSAP(string rfcFuctionName, List<string> rfcTableNameList, Dictionary<string, object> keyValues = null)
            {
                if (string.IsNullOrEmpty(rfcFuctionName) || rfcTableNameList == null || rfcTableNameList.Count <= 0)
                    return null;
                List<string> rfcTableNames = rfcTableNameList.Distinct().ToList();
                try
                {
                    Dictionary<string, DataTable> result = new Dictionary<string, DataTable>();
                    Dictionary<string, IRfcTable> rfcTableDic = new Dictionary<string, IRfcTable>();
                    RfcDestination destination = GetRfcDestination();
                    IRfcFunction func = destination.Repository.CreateFunction(rfcFuctionName);
                    if (keyValues != null && keyValues.Count > 0)
                    {
                        foreach (var item in keyValues)
                        {
                            func.SetValue(item.Key, item.Value);
                        }
                    }
                    rfcTableNames.ForEach(item =>
                    {
                        IRfcTable rfcTable = func.GetTable(item);
                        rfcTableDic.Add(item, rfcTable);
                    });
                    func.Invoke(destination);
                    rfcTableNames.ForEach(item =>
                    {
                        result.Add(item, GetDataTableFromRFCTable(rfcTableDic[item]));
                    });
                    return result;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 转换IRfcTable为Datatable
            /// </summary>
            /// <param name="myrfcTable"></param>
            /// <returns></returns>
            private static DataTable GetDataTableFromRFCTable(IRfcTable myrfcTable)
            {
    
                DataTable loTable = new DataTable();
                int liElement = 0;
                for (liElement = 0; liElement <= myrfcTable.ElementCount - 1; liElement++)
                {
                    RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
                    loTable.Columns.Add(metadata.Name);
                }
                foreach (IRfcStructure Row in myrfcTable)
                {
                    DataRow ldr = loTable.NewRow();
                    for (liElement = 0; liElement <= myrfcTable.ElementCount - 1; liElement++)
                    {
                        RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
                        ldr[metadata.Name] = Row.GetString(metadata.Name);
                    }
                    loTable.Rows.Add(ldr);
                }
                return loTable;
            }
        }
    }
    螃蟹在剥我的壳,笔记本在写我。 漫天的我落在枫叶雪花上。 而你在想我。
  • 相关阅读:
    人们常说的带宽是什么意思?
    关注前端性能
    单测学习笔记
    基于 Istanbul 生成测试用例覆盖率报告
    如何做高水科研
    Human-like Controllable Image Captioning with Verb-specific Semantic Roles(具有动词语义角色的类人可控图像字幕生成)
    Netty应用程序的全部基本构建模块_netty学习笔记(2)-20210405
    异步和事件驱动_netty学习笔记(1)-20210330
    理解 cosocket(转)
    nginx lua阶段处理流程
  • 原文地址:https://www.cnblogs.com/skytitan/p/9817224.html
Copyright © 2011-2022 走看看