<分区>
我在互联网上找到了很多例子,但很多都是旧的(VS 2003,SAP.Net Connector 2.0,当前是 3.0)。
我想知道如何使用 SAP。 NET 连接器。
我应该安装哪些文件?
添加到项目中的引用?
如何在服务器资源管理器中添加提供程序以创建连接?
<分区>
我在互联网上找到了很多例子,但很多都是旧的(VS 2003,SAP.Net Connector 2.0,当前是 3.0)。
我想知道如何使用 SAP。 NET 连接器。
我应该安装哪些文件?
添加到项目中的引用?
如何在服务器资源管理器中添加提供程序以创建连接?
最佳答案
要求:
为您的平台确定正确的版本。您可能会遇到以下情况:
.. 对于 Windows 7 64 位安装,我们将使用 sapnco30dotnet40P_12-20007348.zip
。
展开存档,并启动.msi
安装文件。
.. 遵循安装程序,保留所有默认选项(下一步..下一步..下一步..完成)。
打开 Visual Studio 并创建一个新项目(或打开您自己的项目)。
在 Solution Explorer
面板中,通常在您的右侧,右键单击 References
并选择 Add Reference
:
.. 然后,选择Browse
选项卡,导航到 SAP Connector 安装文件夹,然后选择 sapnco.dll
和 sapnco_utils.dll
:
现在您已在 Visual Studio 项目中正确引用了 SAP .NET 连接器,您可以为其编写代码。
首先创建一个目标配置类(将连接参数替换为您的客户端提供的参数):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SAP.Middleware.Connector; // your sap connector
namespace WindowsFormsSapApplication1
{
public class ECCDestinationConfig : IDestinationConfiguration
{
public bool ChangeEventsSupported()
{
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
public RfcConfigParameters GetParameters(string destinationName)
{
RfcConfigParameters parms = new RfcConfigParameters();
if (destinationName.Equals("mySAPdestination"))
{
parms.Add(RfcConfigParameters.AppServerHost, "sapnode.mycompany.net");
parms.Add(RfcConfigParameters.SystemNumber, "21");
parms.Add(RfcConfigParameters.SystemID, "CF1");
parms.Add(RfcConfigParameters.User, "mySAPuser");
parms.Add(RfcConfigParameters.Password, "mySAPpassword");
parms.Add(RfcConfigParameters.Client, "100");
parms.Add(RfcConfigParameters.Language, "EN");
parms.Add(RfcConfigParameters.PoolSize, "5");
}
return parms;
}
}
}
.. 然后,连接到 SAP 并调用函数。假设您要使用 BAPI_COMPANYCODE_GETLIST
SAP 函数检索公司列表:
public void GetCompanies() {
ECCDestinationConfig cfg = new ECCDestinationConfig();
RfcDestinationManager.RegisterDestinationConfiguration(cfg);
RfcDestination dest = RfcDestinationManager.GetDestination("mySAPdestination");
RfcRepository repo = dest.Repository;
IRfcFunction testfn = repo.CreateFunction("BAPI_COMPANYCODE_GETLIST");
testfn.Invoke(dest);
var companyCodeList = testfn.GetTable("COMPANYCODE_LIST");
// companyCodeList now contains a table with companies and codes
}
在上面的示例中,GetTable
函数返回一个您可能喜欢或不喜欢的 SAP 表。有一个方便的扩展可以在熟悉的 .NET DataTable
中转换该表,如下所示:
public static class IRfcTableExtentions
{
/// <summary>
/// Converts SAP table to .NET DataTable table
/// </summary>
/// <param name="sapTable">The SAP table to convert.</param>
/// <returns></returns>
public static DataTable ToDataTable(this IRfcTable sapTable, string name)
{
DataTable adoTable = new DataTable(name);
//... Create ADO.Net table.
for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
{
RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);
adoTable.Columns.Add(metadata.Name, GetDataType(metadata.DataType));
}
//Transfer rows from SAP Table ADO.Net table.
foreach (IRfcStructure row in sapTable)
{
DataRow ldr = adoTable.NewRow();
for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
{
RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);
switch (metadata.DataType)
{
case RfcDataType.DATE:
ldr[metadata.Name] = row.GetString(metadata.Name).Substring(0, 4) + row.GetString(metadata.Name).Substring(5, 2) + row.GetString(metadata.Name).Substring(8, 2);
break;
case RfcDataType.BCD:
ldr[metadata.Name] = row.GetDecimal(metadata.Name);
break;
case RfcDataType.CHAR:
ldr[metadata.Name] = row.GetString(metadata.Name);
break;
case RfcDataType.STRING:
ldr[metadata.Name] = row.GetString(metadata.Name);
break;
case RfcDataType.INT2:
ldr[metadata.Name] = row.GetInt(metadata.Name);
break;
case RfcDataType.INT4:
ldr[metadata.Name] = row.GetInt(metadata.Name);
break;
case RfcDataType.FLOAT:
ldr[metadata.Name] = row.GetDouble(metadata.Name);
break;
default:
ldr[metadata.Name] = row.GetString(metadata.Name);
break;
}
}
adoTable.Rows.Add(ldr);
}
return adoTable;
}
private static Type GetDataType(RfcDataType rfcDataType)
{
switch (rfcDataType)
{
case RfcDataType.DATE:
return typeof(string);
case RfcDataType.CHAR:
return typeof(string);
case RfcDataType.STRING:
return typeof(string);
case RfcDataType.BCD:
return typeof(decimal);
case RfcDataType.INT2:
return typeof(int);
case RfcDataType.INT4:
return typeof(int);
case RfcDataType.FLOAT:
return typeof(double);
default:
return typeof(string);
}
}
}
引用:http://antswift.wordpress.com/2011/12/22/irfctable-to-net-datatable-extention-method/
添加上述扩展后,您现在可以将结果转换为DataTable
:
// get the regular SAP structured table..
var companyCodeList = testfn.GetTable("COMPANYCODE_LIST");
// turn it into a DataTable..
var companyDataTable = companyCodeList.ToDataTable();
// use it
SomeForm.DataGridView.DataSource=companyDataTable;
关于c# - 在 VS 2008 中使用 SAP.net Connector 的分步教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300049/
相关文章:
c# - 无法摆脱 Visual Studio 2010 xaml 编辑器中的十字准线(放置新项目)光标
c# - List<> 最好以最大容量初始化并且只使用其中的一小部分,或者初始化没有容量
c# - 如何更改此正则表达式以与 .Net 正则表达式引擎一起使用?
sap-dotnet-connector - 将项目添加到 IRfcTable
c# - LINQ 不会用 float 对组求和吗?属性(property)
c# - 使用 RFC_READ_TEXT 从销售订单中检索文本
c# - 有没有办法通过使用命名空间而不是 using 指令 "using namespace_name"来引用某个类/接口(interface)/...?