C#与SAP进行数据交互

  最近项目中需要与SAP进行数据对接,特此记录。

  首先在项目中引用sapnco.dll和sapnco_utils.dll,然后在web.config配置文件中添加SAP一些主要配置信息,为获取SAP配置信息专门写了一个Common类,如下:

  

 1     public abstract class Common
 2     {
 3         /// <summary>
 4         /// 获取SAP配置信息
 5         /// </summary>
 6         public static SAPServerInfoModel GetSapServerInfo()
 7         {
 8             SAPServerInfoModel sapInfo = new SAPServerInfoModel
 9             {
10                 NAME = ConfigurationManager.AppSettings["NAME"],
11                 ASHOST = ConfigurationManager.AppSettings["ASHOST"],
12                 CLIENT = ConfigurationManager.AppSettings["CLIENT"],
13                 USER = ConfigurationManager.AppSettings["USER"],
14                 PASSWD = ConfigurationManager.AppSettings["PASSWD"],
15                 SYSNR = ConfigurationManager.AppSettings["SYSNR"],
16                 LANG = ConfigurationManager.AppSettings["LANG"]
17             };
18             return sapInfo;
19         }
20     }

  为初始化SAP配置信息添加了个SAPConfiguration类,如下:

  

    public class SAPConfiguration : IDestinationConfiguration
    {
        public bool ChangeEventsSupported()
        {
            return false;
        }

        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;

        private SAPServerInfoModel info;

        public SAPConfiguration(SAPServerInfoModel info)
        {
            this.info = info;
        }

        public RfcConfigParameters GetParameters(string destinationName)
        {
            try
            {
                if (destinationName.Equals("PRD"))
                {
                    RfcConfigParameters parms = new RfcConfigParameters();
                    parms.Add(RfcConfigParameters.Name, info.NAME);
                    parms.Add(RfcConfigParameters.AppServerHost, info.ASHOST);
                    parms.Add(RfcConfigParameters.Client, info.CLIENT);
                    parms.Add(RfcConfigParameters.User, info.USER);
                    parms.Add(RfcConfigParameters.Password, info.PASSWD);
                    parms.Add(RfcConfigParameters.Language, info.LANG);
                    parms.Add(RfcConfigParameters.SystemNumber, info.SYSNR);
                    return parms;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

  最后写了一个SAP帮助类,如下:

  

    public class SAPServerHelper : IDisposable
    {
        private RfcDestination prd;//SAP Rfc定义声明对象

        private SAPConfiguration sapConfig;//SAP配置对象

        #region 创建SAP连接对象
        /// <summary>
        /// 创建SAP连接对象
        /// </summary>
        public SAPServerHelper()
        {
            SAPServerInfoModel sapInfo = Common.GetSapServerInfo();
            sapConfig = new SAPConfiguration(sapInfo);
            prd = RfcDestinationManager.GetDestination(sapConfig.GetParameters("PRD"));
        }
        #endregion

        #region 与SAP进行数据交互(MES->SAP && SAP->MES)
        /// <summary>
        /// 与SAP进行数据交互(MES->SAP && SAP->MES)
        /// </summary>
        /// <param name="funName">SAP接口名</param>
        /// <param name="lstParameters">SAP传入参数列表</param>
        /// <param name="TableName">SAP表名</param>
        /// <param name="rtbInputList">SAP传入参数Table列表</param>
        /// <param name="outParameters">返回值列表</param>
        /// <param name="outList">返回参数列表</param>
        /// <returns></returns>
        public DataTable getSapFunctionToTable(string funName, Dictionary<string, string> lstParameters, string TableName,
            Dictionary<IRfcTable, string> rtbInputList, out Dictionary<string, string> outParameters, List<string> outList)
        {
            Dictionary<string, string> outDataList = new Dictionary<string, string>();

            DataTable dt = new DataTable();
            RfcRepository repo = prd.Repository;
            //输入
            IRfcFunction function = repo.CreateFunction(funName);
            foreach (var item in lstParameters)
            {
                function.SetValue(item.Key, item.Value);
            }
            foreach (var item in rtbInputList)
            {
                function.SetValue(item.Value, item.Key);
            }
            function.Invoke(prd);

            //输出
            IRfcTable rtb = function.GetTable(TableName);
            foreach (var item in outList)
            {
                outDataList[item] = function.GetString(item);
            }
            outParameters = outDataList;
            dt = CreateTable(rtb, TableName);
            return dt;
        }
        #endregion

        #region 与SAP进行数据交互(MES->SAP)返回Table
        /// <summary>
        ///
        /// </summary>
        /// <param name="funName">RFC名称</param>
        /// <param name="lstParameters">参数列表</param>
        /// <param name="TableName">返回值Table结构名称</param>
        /// <returns></returns>
        public DataTable getSapFunctionToTable(string funName, Dictionary<string, string> lstParameters,
            string TableName)
        {
            DataTable dt = new DataTable();
            RfcRepository repo = prd.Repository;
            IRfcFunction function = repo.CreateFunction(funName);
            foreach (var item in lstParameters)
            {
                function.SetValue(item.Key, item.Value);
            }
            function.SetParameterActive(0, true);
            function.Invoke(prd);
            IRfcTable rtb = function.GetTable(TableName);
            dt = CreateTable(rtb, TableName);
            return dt;
        }
        #endregion

        #region 与SAP进行数据交互(MES->SAP)返回多个字符串+Table
        /// <summary>
        ///
        /// </summary>
        /// <param name="funName">RFC名称</param>
        /// <param name="lstParameters">参数列表</param>
        /// <param name="TableName">返回值Table结构名称</param>
        /// <param name="outParameters">接收返回字符串List</param>
        /// <param name="outList">返回参数列表</param>
        /// <returns></returns>
        public DataTable getSapFunctionToTable(string funName, Dictionary<string, string> lstParameters,
            string TableName, out Dictionary<string, string> outParameters, List<string> outList)
        {
            Dictionary<string, string> outDataList = new Dictionary<string, string>();
            DataTable dt = new DataTable();
            RfcRepository repo = prd.Repository;
            IRfcFunction function = repo.CreateFunction(funName);
            foreach (var item in lstParameters)
            {
                function.SetValue(item.Key, item.Value);
            }
            function.SetParameterActive(0, true);
            function.Invoke(prd);
            IRfcTable rtb = function.GetTable(TableName);
            foreach (var item in outList)
            {
                outDataList[item] = function.GetString(item);
            }
            outParameters = outDataList;
            dt = CreateTable(rtb, TableName);
            return dt;
        }
        #endregion

        #region 根据返回的数据,生成DataTable
        /// <summary>
        /// 根据返回的数据,生成DataTable
        /// </summary>
        /// <param name="rtb"></param>
        /// <param name="TableName"></param>
        /// <returns></returns>
        private DataTable CreateTable(IRfcTable rtb, string TableName)
        {
            DataTable dt = new DataTable(TableName);

            //建立表结构,设定表头
            for (int i = 0; i <= rtb.ElementCount - 1; i++)
            {
                DataColumn col = new DataColumn(rtb.GetElementMetadata(i).Name);
                dt.Columns.Add(col);
            }
            //填充表数据
            for (int k = 0; k <= rtb.RowCount - 1; k++)
            {
                DataRow dr = dt.NewRow();
                for (int i = 0; i <= rtb.ElementCount - 1; i++)
                {
                    dr[i] = rtb[k][i].GetValue();
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion

        #region 定义要给SAP传送的数据列表(把实际的Table数据转换成SAP可识别的Table数据)
        /// <summary>
        /// 定义要给SAP传送的数据列表(把实际的Table数据转换成SAP可识别的Table数据)
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="funName"></param>
        /// <param name="TableName"></param>
        /// <returns></returns>
        public IRfcTable CreateRfcTable(DataTable dt, string funName, string TableName)
        {
            RfcRepository repo = prd.Repository;
            IRfcFunction Z_RFC_ZCOX = repo.CreateFunction(funName);
            IRfcTable rtb = Z_RFC_ZCOX.GetTable(TableName, true);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                rtb.Append();
                foreach (DataColumn col in dt.Columns)
                {
                    rtb.SetValue(rtb[i][col.ColumnName].Metadata.Name, dt.Rows[i][col.ColumnName].ToString());
                }
            }
            return rtb;
        }
        #endregion

        #region 释放资源
        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            RfcDestinationManager.UnregisterDestinationConfiguration(sapConfig);
        }
        #endregion
    }

  该帮助类基本可以实现所有与SAP通过RFC接口进行数据交互,后续根据项目需要继续完善。

时间: 2024-10-07 10:51:19

C#与SAP进行数据交互的相关文章

AJAX+REA实现前后台数据交互的加密解密

AJAX+REA实现前后台数据交互的加密解密 1.创建js文件Encryption.js /**  * 加密解密  */ /** RSA加密用 生成key */ function bodyRSA(){ /** 1024位的key参数写130,2014位的key参数写260 */ setMaxDigits(130); /** ajax 调用后台方法,取回公钥 */ var keyR ;     $.ajax({      url: "/GHGL/Key/pk",//请求后台的url,本例

浅谈混合开发与Android,JS数据交互

本文是作者原创,如转载请注明出处! 一.概论 现在时代已经走过了移动互联网的超级火爆阶段,市场上移动开发人员已经趋于饱和,显然,只会原生APP的开发已不能满足市场的需求,随着H5的兴起与火爆,H5在原生APP中的使用越来越广泛,也就是我们常说的混合开发(Hybrid APP).最新很火的微信小程序相信大家都是知道的,实际上微信小程序加载的界面就是一个HTML5的界面,HTML5界面在一些电商类的APP中主要承担展示数据的作用,但是他的作用并不仅限于此,最起码js调用原生方法和原生调用js的方法是

Struts2基本使用(三)--数据交互

Struts2中的数据交互 在Struts2中我们不必再使用request.getParameter()这种方式来获取前台发送到服务器的参数. 我们可以在服务器端的Java类中直接声明一个和前台发送数据的同名变量即可,然后生成它的set/get方法即可以实现前后台数据的交互. 假如我们在前台页面中的表单如下: <form method="post" action="demo!register.action"> username:<input typ

JavaScript模板引擎实现数据交互

经过1年的磨练,近期终于稍微明白到,前端是怎么做到企业要求的:数据交互. 1,ajax+json这个是必须学的,但没问题,我们可以通过这个博客来慢慢了解怎么回事? 2,可以通过JS框架和JS模板来实现,但最后还是要用到ajax+json的. 注意:个人建议 假如项目页面数量是少于50-100个的,那么推荐使用JS模板:如果大于100个的用JS框架.各有各优势嘛. 今晚的博客分几次写完,看到这句话删除就证明已经写完了. 先分享JS模板的内容:我这次推荐使用百度的模板引擎,因为他比腾讯的art运行速

ASP.NET MVC 4 中的JSON数据交互

前台Ajax请求很多时候需要从后台获取JSON格式数据,一般有以下方式: 拼接字符串 return Content("{\"id\":\"1\",\"name\":\"A\"}"); 为了严格符合Json数据格式,对双引号进行了转义. 使用JavaScriptSerialize.Serialize()方法将对象序列化为JSON格式的字符串 MSDN 例如我们有一个匿名对象: var tempObj=new

Spring MVC基础知识整理?View与Controller数据交互

概述 Spring MVC是由View—Controller—Model组成,其中View和Controller的数据交互,成为了关注的核心点.MVC中,我们将View中的数据传递到Controller,可以采用POST或者Get,传递相应的参数.Controller通过绑定来,匹配前台传递的参数.后台Controller也可以将值传递到前台页面. View值传递Controller 绑定传值的常用方式有如下 @RequestParam,绑定单个请求数据,可以是URL中的数据,表单提交的数据或上

springMVC学习(11)-json数据交互和RESTful支持

一.json数据交互: json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. springMVC进行json交互 1)环境准备: 加载json转换的jar包: springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转) jackson-core-asl-1.9.11.jar jackson-mapper-asl-1.9.11.

JSONP -- 跨域数据交互协议

一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式.基于纯文本.被原生JS支持.    格式:两种数据类型描述符:大括号{ }.方括号[ ].分隔符逗号.映射符冒号.定义符双引好. ④JSONP:一种跨域数据交互协议,非官方. 1.Web页面调用js文件,可跨域.扩展:但凡有src属性的标签都具有跨域能力. 2.跨域服务器 动态生成数据 并存入js

基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理.本文主要介绍利用Jquery处理数据交互的几种方式,包括获取数据并显示,插入新数据到服务器,更新数据,删除数据等操作. 1.利用Jquery获取数据并显示 为了顺利获取数据,我们需要保持页面端调用和服务器端保持一致,并相应的把数据转换或者封装为对象实体进行处理. 下面我们以一个简单的全国省份.全国城市.全国城市行政区的案例进行Demo代码的介绍.   总