.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, "");
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, "");
pairs.Add(RfcConfigParameters.MaxPoolSize, "");
pairs.Add(RfcConfigParameters.IdleTimeout, "");
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 <= )
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 > )
{
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 = ;
for (liElement = ; liElement <= myrfcTable.ElementCount - ; liElement++)
{
RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
loTable.Columns.Add(metadata.Name);
}
foreach (IRfcStructure Row in myrfcTable)
{
DataRow ldr = loTable.NewRow();
for (liElement = ; liElement <= myrfcTable.ElementCount - ; liElement++)
{
RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
ldr[metadata.Name] = Row.GetString(metadata.Name);
}
loTable.Rows.Add(ldr);
}
return loTable;
}
}
}
.NET利用RFC连接SAP,查询、读取SAP数据的更多相关文章
- 利用Angular.js从PHP读取后台数据
之前已经有非常多方法能够通过angular进行本地数据的读取.曾经的样例中,大多数情况都是将数据存放到模块的$scope变量中,或者直接利用ng-init定义初始化的数据. 可是这些方法都仅仅为了演示 ...
- Jquery Mobile实例--利用优酷JSON接口读取视频数据
本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到A ...
- 30. PL/SQL Developer连接服务器查询时,数据乱码处理
在windows中创 建一个名为“NLS_LANG”的系统环境变量,设置其值为"AMERICAN_AMERICA.ZHS16GBK", NLS_LANG的值为:select u ...
- 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...
- 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...
- [PHP]socket的连接超时 与 读取/写入超时
socket处理时有两种超时 , 分为连接超时 和 读取/写入数据超时 1. stream_socket_client 函数中的超时时间是连接超时 , 默认是php.ini中的default_sock ...
- STM32读取Guidance数据——Guidance SDK
更新记录:2019/11/14 更新STM32(F407VET6)读取Guidance数据 Github地址. 背景:想要将祖传的Guidance用于DJI A3/新固件的N3飞控.DJI已经停 ...
- .NET通过RFC读取SAP数据
本篇文章中我主要讲的是.NET如何通过RFC从SAP中读取数据.为了功能的可复用性,我将调用RFC的代码从业务层中分离出来单独建立在一个namespace中. 当然除了需要我们自己编写代码以外,还需要 ...
- C#如何通过NCO3.0来连接SAP并调用SAP中的RFC
,这是SAP针对.Net开发的专用组件,安装完成之后在C:\Program Files\SAP\SAP_DotNetConnector3_x86目录下面会有sapnco_utils.dll sapnc ...
随机推荐
- rsyslog服务器同步其他服务器上面应用日志(如mysql审计日志 、nginx日志)
**环境说明**系统:ubuntu 14.04 (CentOS可以参考http://www.cnblogs.com/hanyifeng/p/5463338.html) rsyslog版本 :8.16. ...
- django 请求生命周期
详细例子:
- spark_spark连接hive config
1 环境 hadoop2.7.3 apache-hive-2.1.1-bin spark-2.1.0-bin-hadoop2.6 jdk1.8 2 配置文件 在hive-site.xml中配置mysq ...
- 剑指Offer——数组中出现次数超过一半的数字——一题多解
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- Java面向对象_抽象类应用——模板方法模式
概念:定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 去个例子分析一下这个概念: public cla ...
- Hadoop完全分布式环境下,DataNode进程正常启动,但是网页上不显示DataNode节点
Hadoop完全分布式环境下,上传文件到hdfs上时报错: // :: WARN hdfs.DFSClient: DataStreamer Exception org.apache.hadoop.ip ...
- pat1061. Dating (20)
1061. Dating (20) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holmes ...
- 【Python】python2 str 编码检测
python2 str 编码检测 import chardet s = 'sdffdfd' print type(s) print chardet.detect(s) s2 = '反反复复' prin ...
- window下安装scala搭载Intellij IDE
最近由于公司业务需求,要用到scala,编写还是windows下较好,linux下运行比较靠谱,废话少说,直接上步骤! 1.首先安装java环境 jdk下载地址:http://www.oracle.c ...
- Linux让Apache支持中文URL图片/文件名
需要用到iconv_hook和mod_encoding Apache(32位): 安装环境:CentOS 5.6 + Apache 2.2.15 (Apache2.4同样适用) 安装结果:安装后支持“ ...