.NET通过RFC读取SAP数据

  本篇文章中我主要讲的是.NET如何通过RFC从SAP中读取数据。为了功能的可复用性,我将调用RFC的代码从业务层中分离出来单独建立在一个namespace中。

  当然除了需要我们自己编写代码以外,还需要引用SAP提供的程序集文件(sapnco.dll、sapnco_utils.dll),在代码文件需要引用相应的命名空间(using
SAP.Middleware.Connector;)。

  我在这个namespace中建立了三个类来实现这个功能,一个配置类(RfcDestinationConfig)、一个参数类(RfcParam)、一个主体功能类(RfcManager)。

  • RfcDestinationConfig

  我们需要一个类来实现SAP的连接配置工作,就如同为数据连接层建立一个数据库配置类一样重要。


 1 public class RfcDestinationConfig : IDestinationConfiguration
2 {
3 #region 事件
4 /// <summary>
5 /// 配置变更事件
6 /// </summary>
7 public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
8 /// <summary>
9 /// 默认接收器名称
10 /// </summary>
11 public static readonly string DefaultDesName = "destination";
12 #endregion
13
14 #region 方法
15 /// <summary>
16 /// 配置变更事件触发时,暂时无用
17 /// </summary>
18 /// <param name="destinationName"></param>
19 /// <param name="args"></param>
20 public void OnConfigurationChanged(string destinationName, RfcConfigurationEventArgs args)
21 {
22 if (ConfigurationChanged != null)
23 {
24 ConfigurationChanged(destinationName, args);
25 }
26 }
27
28 /// <summary>
29 /// 获取SAP配置参数
30 /// </summary>
31 /// <param name="destinationName"></param>
32 /// <returns></returns>
33 public RfcConfigParameters GetParameters(string destinationName)
34 {
35 if (destinationName == DefaultDesName)
36 {
37 RfcConfigParameters parms = new RfcConfigParameters();
38 parms.Add(RfcConfigParameters.AppServerHost,ConfigManager.GetAppSettings("SAPApplicationServer").Trim()); //SAP主机IP
39 parms.Add(RfcConfigParameters.SystemNumber, ConfigManager.GetAppSettings("SAPSystemNumber").Trim()); //SAP实例
40 parms.Add(RfcConfigParameters.User, ConfigManager.GetAppSettings("SAPUser").Trim()); //用户名
41 parms.Add(RfcConfigParameters.Password,ConfigManager.GetAppSettings("SAPPwd").Trim()); //密码
42 parms.Add(RfcConfigParameters.Client, ConfigManager.GetAppSettings("SAPClient").Trim()); // Client
43 parms.Add(RfcConfigParameters.Language,ConfigManager.GetAppSettings("SAPLanguage").Trim()); //登陆语言
44 return parms;
45 }
46 else
47 {
48 return null;
49 }
50 }
51
52 /// <summary>
53 /// 变更事件方法,暂时无用
54 /// </summary>
55 /// <returns>true</returns>
56 public bool ChangeEventsSupported()
57 {
58 return true;
59 }
60 #endregion
61 }

  • RfcParam

  想要从SAP中读取数据,就必须将查询条件作为参数传递给RFC。另外为了返回的结果具有通用性,我使用DataTable作为返回结果的类型,然后考虑到不同条件下列是不同的,我又将列也参数化,最终我将输入参数和输出参数都封装在一个参数类之中。


 1 public class RfcParam
2 {
3 /// <summary>
4 /// 初始化
5 /// </summary>
6 public RfcParam()
7 {
8 CoulmnNames = new List<string>();
9 Param = new Dictionary<string, object>();
10 }
11 /// <summary>
12 /// RFC方法名称
13 /// </summary>
14 public string RfcName { get; set; }
15 /// <summary>
16 /// RFC表名
17 /// </summary>
18 public string TableName { get; set; }
19 /// <summary>
20 /// 数据表各列的列名
21 /// </summary>
22 public List<string> CoulmnNames { get; set; }
23 /// <summary>
24 /// RFC执行参数
25 /// </summary>
26 public Dictionary<string, object> Param { get; set; }
27 }

  • RfcManager

  该主角登场了,读取数据的功能正是业务层真正想要的东西。

  方法ExecRfc首先将输出参数转换成一个真正可用的新的DataTable,然后将输入参数传递给SAP执行相关的RFC功能并返回IRfcTable(SAP定义的一种接口),最后再将IRfcTable转换成我们自定义的DataTable。


 1 public class RfcManager
2 {
3 #region 属性字段
4 /// <summary>
5 /// 接收器
6 /// </summary>
7 public RfcDestination Prd { get; set; }
8 /// <summary>
9 /// 数据仓库
10 /// </summary>
11 public RfcRepository Repo { get; set; }
12 #endregion
13
14 #region 构造函数
15 /// <summary>
16 /// 初始化
17 /// </summary>
18 public RfcManager()
19 {
20 //初始化RFC接收器
21 //配置接收器
22 IDestinationConfiguration IDC = new RfcDestinationConfig();
23 //注册
24 RfcDestinationManager.RegisterDestinationConfiguration(IDC);
25 //获取RFC接收器
26 this.Prd = RfcDestinationManager.GetDestination(RfcDestinationConfig.DefaultDesName);
27 this.Repo = this.Prd.Repository;
28 //注销
29 RfcDestinationManager.UnregisterDestinationConfiguration(IDC);
30 }
31 #endregion
32
33 #region 方法
34 /// <summary>
35 /// 执行RFC获取数据表
36 /// </summary>
37 /// <param name="rfcname">rfc方法名称</param>
38 /// <param name="tablename">rfc表名</param>
39 /// <param name="columnnames">数据表列名列表</param>
40 /// <param name="param">rfc执行参数</param>
41 /// <returns>数据表</returns>
42 public DataTable ExecRfc(string rfcname, string tablename, List<string> columnnames, Dictionary<string, object> param)
43 {
44 DataTable dt = new DataTable();
45
46 if (columnnames != null && columnnames.Count > 0)
47 {
48 //配置datatable
49 dt.Columns.Clear();
50 foreach (string cname in columnnames)
51 {
52 dt.Columns.Add(cname, typeof(string));
53 }
54 dt.AcceptChanges();
55
56 //从SAP那获取数据表
57 if (!string.IsNullOrEmpty(rfcname) && param != null && param.Count > 0)
58 {
59 IRfcFunction rfc = this.Repo.CreateFunction(rfcname);
60 foreach (KeyValuePair<string, object> kv in param)
61 {
62 rfc.SetValue(kv.Key, kv.Value);
63 }
64 rfc.Invoke(this.Prd);
65 IRfcTable iTable = rfc.GetTable(tablename);
66 if (iTable.Count > 0)
67 {
68 for (int i = 0; i < iTable.RowCount; i++)
69 {
70 iTable.CurrentIndex = i;
71 DataRow oNewRow = dt.NewRow();
72 foreach (string cname in columnnames)
73 {
74 oNewRow[cname] = iTable.GetString(cname).ToString();
75 }
76 dt.Rows.Add(oNewRow);
77 }
78 }
79 }
80 }
81
82 return dt;
83 }
84 #endregion
85 }

.NET通过RFC读取SAP数据,布布扣,bubuko.com

时间: 2024-10-13 12:02:08

.NET通过RFC读取SAP数据的相关文章

一百一十五、脱离SAP本体,通过ActiveX读取SAP表中数据

一.Sap自带有客户端,但是非常之臃肿卡顿,可以利用ActiveX的方式,脱离Sap本体,来读取Sap表中的内容进行插入等操作,非常之方便.代码如下: 二.界面如下,输入好相关内容,点击登录,提示登录成功 三.点击读表内容按钮,可以读出来表内容 四.我们打开SAP的表,和我们读出来的对比一下,发现一模一样 非常之完美,有很大的想象空间. 原文地址:https://www.cnblogs.com/tianpan2019/p/11444016.html

SAP 数据归档

由于数据库越来越大,对于管理和使用都是一个大的问题,我们归档的目的就是为了是数据库进可能的小,加快用户响应时间,并且对于用户对于数据库的查询来说,进可能加载多的表到内存中. 归档就是上面两个要求的平衡点,首先把不需要经常使用的商务对象数据从数据库中提取出来写到一个归档文件中,然后把相关对象从数据库删除,这就减小数据库大小.并且这些归档数据同样还是可以被用户读取和查询的. 注意商业对象可能在数据库中跨多个表存储,归档对象是把这些表中这个商业对象全部归结到这个对象来的. 然后才会在所有这些表中删除关

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序读取相关数据 原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经完成了学校数据模型.在本教程中你将

读取数据库数据,并将数据整合成3D饼图在jsp中显示

首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) 1 import java.io.IOException; 2 import java.sql.SQLException; 3 import org.jfree.chart.ChartFactory; 4 import org.jfree.chart.JFreeChart; 5 import org.jfree.data.general.DefaultPieDataset; 6 7 p

asp.net读取Excel数据

先通过控件FileUpload获取excel文件路径 protected void btnReadExcelFromFileUpload_Click(object sender, EventArgs e) { if (fupExcel.PostedFile.ContentLength > 0) { //获取全路径 string fullFileName = fupExcel.PostedFile.FileName.ToString(); //获取文件名 string fileName = fup

Jquery Mobile实例--利用优酷JSON接口读取视频数据

本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到API接口 (http://open.youku.com/docs/tech_doc.html) 可以看到优酷提供不少API,本文将演示“通过视频关键词”接口. 点击进去后,会发现client_id和keyword是必填的,因此,未来构造的URL应该类似 https://openapi.youku.c

使用 Http 的 Get 方式读取网络数据

作为移动平台的应用,一定避免不了与网络交换数据,不论是读取网页数据,还是调用API接口,都必须掌握Http通信技术 代码如下: package zw1; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.UR

Qt通过odbc读取excel数据

传统的读取方式是通过Excel.Application,这种方式不仅操作繁琐,而且速度也不快. 通过odbc读取,可以使用select语句直接读取整个工作表,处理excel数据就跟数据库一样方便. 当然,这种方式也有不足: 1.excel表格必须只能有一行表头. 2.相对于Excel.Application,无法准确定位单元格. 3.工作表名相当于数据库表名,表头相当于字段名,所以excel格式必须的固定的,否则无法读取到数据 读取的代码如下: //文件路径 QString filePath;

猜想-未做 利用office组件读取excel数据

---未实际使用过 用SQL-Server访问Office的Access和Excel http://blog.sina.com.cn/s/blog_964237ea0101532x.html 2007 Office system 驱动程序:数据连接组件 http://www.microsoft.com/zh-CN/download/details.aspx?id=23734 2007 Office system 驱动程序:数据连接组件 详情 版本:All File Name:AccessData