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;
            }
        }
    }
    螃蟹在剥我的壳,笔记本在写我。 漫天的我落在枫叶雪花上。 而你在想我。
  • 相关阅读:
    实战parse_ini_file()及扩展函数解析ini文件完整版
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    LeetCode: Best Time to Buy and Sell Stock II [122]
    关于URL编码
    js进阶 14-1 jquery的ajax系列中的load方法的作用是什么
    js进阶 13 jquery动画函数有哪些
    js进阶 13-11/12 jquery如何实现折叠导航
    js进阶 13-9/10 jquery如何实现三级列表
    js进阶 13-8 jquery如何实现侧边栏
    js进阶 13-7 如何实现滑动面板效果
  • 原文地址:https://www.cnblogs.com/skytitan/p/9817224.html
Copyright © 2011-2022 走看看