一步一步的教程使用SAP。 带VS 2008的网络连接器

我在互联网上找到了很多例子,但很多都是旧的(VS 2003,SAP .Net Connector 2.0,其中当前为3.0)。

我想知道如何使用SAP。 NET连接器。

我应该安装哪些文件?

添加到项目的参考?

如何添加提供程序以在服务器资源管理器中创建连接?

使用vs2010和SAP .NET Connector 3.0的示例

要求:

  • Visual Studio .NET 2010(免费的c#Express版本很好)
  • SAP .NET Connector 3.0(您通常可以从客户端获取该项目的项目)

安装

确定适合您平台的正确版本。 您可能会有以下内容:

..对于Windows 7 64位安装,我们将使用sapnco30dotnet40P_12-20007348.zip

展开存档,然后启动.msi安装文件。

..按照安装程序,保留所有默认选项(下一步..下一步..下一步…完成)。

引用

打开Visual Studio并创建一个新项目(或打开您自己的项目)。

Solution Explorer面板中,通常在右侧,右键单击References并选择Add Reference

..然后,选择Browse选项卡,导航到SAP Connector安装文件夹,并选择sapnco.dllsapnco_utils.dll

现在您已在Visual Studio项目中正确引用了SAP .NET Connector,您可以为其编写代码。

首先创建目标配置类(将连接参数替换为客户端给出的连接参数):

 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 { ///  /// Converts SAP table to .NET DataTable table ///  /// The SAP table to convert. ///  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; 

笔记

  • 虽然此示例基于vs2010,但其他Visual Studio版本应该运行得很好。
  • 似乎连接器中的SAP函数名称应始终为UPPERCASE。
  • 如果您的SAP Connector体系结构错误,例如您安装64位版本然后尝试编译32位x86,您将收到如下错误: “无法加载文件或程序集'sapnco,版本= 3.0.0.42,文化= neutral,PublicKeyToken = 50436dca5c7f7d23'或其中一个依赖项。尝试加载格式不正确的程序。“ 这个是正常的; 只需安装正确的版本。

补充阅读