方式1:使用客户端自带的组件

安装客户端以后,添加引用:SAPFunctionsOCX(.net 的Com列表里一般找不到,需要引用DLL【一般位于以下路径:Program Files\SAP\FrontEnd\SAPgui\wdtfuncs.ocx】),SAPLogonCtrl,SAPTableFactoryCtrl。

public DataTable GetRFCData()
{ Connection conn = null;
SAPFunctionsClass func = null;
IFunction ifunc = null; conn = this.getSAPConnection(); //返回SAP登录类
func = this.getSAPFunctionsClass(conn); //返回SAP操作类
ifunc = this.getIFunction("ZHRIF01_FM01", func); //返回SAP接口 //设定SAP RFC函数的参数
IParameter IP_DATA_BEGIN = (IParameter)ifunc.get_Exports("I_DATUM"); //
IP_DATA_BEGIN.Value = "201602"; // "20100101";//;strDatB; //"20090101"; //CALL RFC函数
ifunc.Call(); //输出参数
Tables Table_Outs = (Tables)ifunc.Tables;
Table Table_mkpf = (Table)Table_Outs.get_Item("T_RESULT"); //获取返回结果集
DataTable dt = GetDataTable(Table_mkpf);
//this.label1.Text = dt.Rows.Count.ToString();
return dt;
} public Connection getSAPConnection()
{
//SAP登录类
SAPLogonControlClass logon = new SAPLogonControlClass();
Connection Conn; logon.ApplicationServer = "10.1.8.11";
logon.Client = "300";
logon.Language = "ZH"; //EN OR ZH ....
//logon.Language = "zh"; //EN OR ZH ....
logon.User = "test";
logon.Password = "test1234";
logon.SystemNumber = Convert.ToInt16("00");
Conn = (SAPLogonCtrl.Connection)logon.NewConnection();
//Conn.CodePage = "8300"; //登录SAP
if (!Conn.Logon(0, true)) //Login Successful
{
throw new Exception("登录SAP系统失败,请重新登录!");
} //返回SAP登录类
return Conn;
} public SAPFunctionsClass getSAPFunctionsClass(Connection conn)
{
//SAPFunction Object
SAPFunctionsClass func = new SAPFunctionsClass();
//Set Connection
func.Connection = conn; return func; } /// <summary>
/// 返回接口
/// </summary>
/// <param name="IFunctionName"></param>
/// <returns></returns>
private IFunction getIFunction(string IFunctionName, SAPFunctionsClass func)
{
IFunction ifunc = (SAPFunctionsOCX.IFunction)func.Add(IFunctionName);
return ifunc;
} /// <summary>
/// 将从sap获取的table转换为datatable
/// </summary>
/// <param name="saptb"></param>
/// <returns></returns>
/// private DataTable GetDataTable(Table saptb)
{
DataTable dt = new DataTable();
try
{
for (int i = 1; i < saptb.ColumnCount; i++)
{
//dt.Columns.Add(saptb.get_ColumnName(i), typeof(string));
dt.Columns.Add(saptb.get_ColumnName(i));
}
for (int m = 1; m <= saptb.RowCount; m++)
{
DataRow dr = dt.NewRow();
for (int n= 1; n < saptb.ColumnCount; n++)
{
string columnName=saptb.get_ColumnName(n);
dr[saptb.get_ColumnName(n)] = saptb.get_Cell(m, columnName).ToString(); }
dt.Rows.Add(dr);
}
}
catch (Exception ex)
{
throw ex;
}
return dt;
}

 注意:如果出现中文数据全部为#(井)的情况,这说明是CodePage的问题,暂时没找到解决办法。尝试设定SAPConnection的CodePage,结果提示内存不能写入。

方法2:在机器上没有安装客户端的情况下,使用官网提供的Nco3.0.16.0(SAP Connector for Microsoft .Net)。本DLL含有四个版本。

32位和64位,以及基于.Net2.0 或者 4.0编译的组件(本处代码基于:32位 4.0 的组件,开发环境VS2010),安装完毕后需要引用如下DLL文件:sapnco.dll,sapnco_utils.dll(位于安装目录下)

代码如下:

配置文件:

  <configSections>
<sectionGroup name="SAP.Middleware.Connector">
<sectionGroup name="ClientSettings">
<section name="DestinationConfiguration" type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/>
</sectionGroup>
</sectionGroup>
</configSections> <SAP.Middleware.Connector>
<ClientSettings>
<DestinationConfiguration>
<destinations>
<add NAME="DEV" USER="test" PASSWD="1234" CLIENT="300" LANG="EN" ASHOST="10.1.8.11" SYSNR="00" MAX_POOL_SIZE="10" IDLE_TIMEOUT="10"/>
</destinations>
</DestinationConfiguration>
</ClientSettings>
</SAP.Middleware.Connector>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>

  程序代码:

public static DataTable GetSAPTestData()
{ RfcDestination destination = RfcDestinationManager.GetDestination("DEV"); RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD = destination.Repository.GetFunctionMetadata("ZHRIF01_FM01"); IRfcFunction function = null; function = BAPI_COMPANYCODE_GETDETAIL_MD.CreateFunction(); function.SetValue("I_DATUM", "20160203"); //设置参数
//function.SetParameterActive("COMPANYCODE_ADDRESS", false);设置参数
function.Invoke(destination);//提交调用 IRfcTable returnTable = function.GetTable("T_RESULT");
return GetDataTable(returnTable);
} /// <summary>
/// 将从sap获取的table转换为datatable
/// </summary>
/// <param name="saptb"></param>
/// <returns></returns>
///
public static DataTable GetDataTable(IRfcTable IrfTable)
{
DataTable dt = new DataTable(); //遍历元素个数,循环添加列
for(int i=0;i<IrfTable.ElementCount;i++)
{
string columnName=IrfTable.GetElementMetadata(i).Name;
dt.Columns.Add(columnName);
} ////循环把IRfcTable里面的数据放入Table里面,因为类型不同,不可直接使用。
for (int m= 0; m < IrfTable.RowCount; m++)
{
IrfTable.CurrentIndex = m;
DataRow dr = dt.NewRow();
for(int n =0;n<IrfTable.CurrentRow.Metadata.FieldCount;n++)
{
string colName = IrfTable.GetElementMetadata(n).Name;
dr[colName]=IrfTable.CurrentRow.GetString(colName);
}
dt.Rows.Add(dr);
} return dt;
}

  

  不使用配置文件直接代码写入参数的方式:

public static DataTable GetSapData()
{
RfcConfigParameters rfcPar = new RfcConfigParameters();
rfcPar.Add(RfcConfigParameters.Name, "CON");
rfcPar.Add(RfcConfigParameters.AppServerHost, "10.1.8.11");
rfcPar.Add(RfcConfigParameters.Client, "300");
rfcPar.Add(RfcConfigParameters.User, "test");
rfcPar.Add(RfcConfigParameters.Password, "1234");
rfcPar.Add(RfcConfigParameters.SystemNumber, "00");
rfcPar.Add(RfcConfigParameters.Language, "EN");
rfcPar.Add(RfcConfigParameters.Codepage, "8400");
RfcDestination dest = RfcDestinationManager.GetDestination(rfcPar);
RfcRepository rfcrep = dest.Repository;
IRfcFunction myfun = null;
myfun = rfcrep.CreateFunction("ZHRIF01_FM01");
myfun.SetValue("I_DATUM", "20160203");//SAP里面的传入参数
try
{
myfun.Invoke(dest);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
IRfcTable IrfTable = myfun.GetTable("T_RESULT");
return GetDataTable(IrfTable);
}

  

.net 调用SAP RFC函数获取数据的两种方式的更多相关文章

  1. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  2. Lua 调用的 C 函数保存 state 的两种方式: Storing State in C Functions 笔记

    http://yanbin.is-programmer.com/posts/94214.html Registery的Key 1. 整数Key用于Lua的引用机制,所以不要使用整数作为Key 2. 通 ...

  3. C# 使用 SAP NCO3.0 调用SAP RFC函数接口

    最近使用C#调用SAP RFC函数,SAP提供了NCO3.0组件. 下载组件安装,之后引用“sapnco.dll”和“sapnco_utils.dll”两个文件. 在程序中 using SAP.Mid ...

  4. iOS 通过URL网络获取XML数据的两种方式

    转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...

  5. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  6. SparkStreaming获取kafka数据的两种方式:Receiver与Direct

    简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...

  7. SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式

    SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...

  8. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  9. easyUI之datagrid绑定后端返回数据的两种方式

    先来看一下某一位大佬留下的easyUI的API对datagrid绑定数据的两种方式的介绍. 虽然精简,但是,很具有“师傅领进门,修行靠个人”的精神,先发自内心的赞一个. 但是,很多人和小编一样,第一次 ...

随机推荐

  1. Ubuntu配置网络命令(转载)

    From:http://blog.csdn.net/ithomer/article/details/6264881 以eth0为例   1. 以DHCP方式配置网卡 编辑文件: /etc/networ ...

  2. addSubView需要注意的几个点

    addSubview: Adds a view to the end of the receiver’s list of subviews. 译:增加一个视图到接收者的子视图列表中. - (void) ...

  3. [Flex] ButtonBar系列——labelFunction用户提供的函数,在每个项目上运行以确定其标签

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  4. Java 线程间通讯(共享变量方式)

    Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...

  5. Export excel file using web API

    使用MVC controller输出excel的例子,自不待言,例子满天飞. 由于本项目使用的是Asp.net MVC API,因此在本项目使用API,实现了文件下载功能.代码的原理很简单,基本上是老 ...

  6. POJ 1286 【POLYA】

    题意: 给你三种颜色的珠子,每次给你N,问在旋转,翻转之后视作相同的情况下,能组成多少种不同的项链. 思路: 让我们借这道题拯救一下我对POLYA定理的理解... sigma(m^(gcd(i,n)) ...

  7. Spring-MongoDB简单操作

    1.简单的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  8. ibatis cannot find <sql> pattern

    "Could not find SQL statement to include with refid xxx"A: 认真把每个用到xxx的地方都看一遍

  9. 剑指Offer:面试题5——从尾到头打印链表(java实现)

    问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; L ...

  10. JAVA+PHP+阿里云组件纯手工实现POP、SMTP、IMAP开发邮件服务器(二)

    java开发邮件服务器的接收模块 用java建立socket服务端,监听端口25,实现SMTP协议.即可完成邮件服务器的接收模块. 这里要注意的是,SMTP协议其实可以分为两种.一种是你用手机.PC等 ...