SAP .Net 连接器 3.0 (NCo) 示例






4.58/5 (18投票s)
这是一个简单的示例,展示如何使用 SAP .Net 连接器 3.0 连接到 SAP。
引言
在某些应用程序中,您需要将数据发送到 SAP 系统,并从 SAP 系统获取数据以在网页上显示。本文将帮助您实现这一目标。
背景
本文介绍了如何使用 SAP.Net Connector 3.0 (称为 NCo) 连接到 SAP RFC。本文假定您具备 C# 和 ASP.Net 开发的基础知识。
使用代码
SAP 连接器最重要的部分是拥有所需的 dll。
- .Net Connector 3.0 DLL。它有 32 位 (x86) 和 64 位版本可供选择。
-sapnco.dll
-sapnco_utils.dll
要获取 SAP 连接器 DLL,您需要访问 SAP Market Place,并且需要用户 ID 和密码才能下载。如果您是 .net 开发人员,可能没有这些。请让 SAP Basis 团队下载并为您提供,因为他们通常可以访问 Market Place。
如果您从其他地方获取到,就可以继续进行。
如果您处于开发模式,使用 VS 2012/2013,您需要将生成平台目标选择为 Any CPU。即使您使用的是 64 位计算机,也要添加 32 位 DLL 的引用。
部署到 IIS7.5 或 8 时,如果是 64 位计算机。请将 BIN 文件夹中的 32 位 dll 替换为 64 位 dll。
- SAP 目标服务器配置需要添加到您的配置文件中。这些是连接到 SAP 所需的主要键值对。
启动 Visual Studio 2012 或 2013。
- 创建一个名为 SAPConnector3Example 的 Web 应用程序,并添加 **sapnco.dll** 和 **sapnco_utils.dll** 的引用。
- 添加一个名为 SAPDestinationConfig 的新类,用于读取配置。
- 将 SAP.Middleware.Connector 命名空间添加到此类中,该命名空间来自您刚刚添加到项目引用的 dll。
- 要获取所需的目标,SAP 连接器提供了一个名为 IDestinationConfiguration 的接口。此接口提供一个名为 GetParameters 的方法。您可以使用配置管理器来读取此项并实现此方法。
继承 IDestinationConfiguration 到您的类,然后右键单击它以实现接口。在此步骤之后,类将如下所示:
- GetParameters 方法返回 RfcConfigParameters,这是 SAP 连接器 DLL 中的一个类。更新代码以读取配置值,代码如下:
- 现在应用程序可以获取配置了,下一步是调用此方法。可以在您连接到 SAP 的类中调用它。但是 SAP 连接器有一个名为 RegisterDestinationConfiguration 的方法。在调用之前,所有已定义的目标,如 QA、DEV、PROD,都需要先注册。
您可以在实例化类并连接到 SAP 之前执行此步骤。但考虑到如果有许多用户连接,每个人每次调用 SAP 时都会调用 RegisterDestinationConfiguration。因此,最佳位置是 Global.asax 的 Application_Start 中。
您的应用程序部署并启动后,将有一个目标连接已经注册并准备好使用。
这也将解决一个重要的错误消息,例如“destination configuration already initialized”。
- 您的 Global.asax 应该看起来像这样。请确保在此类中也包含 SAP.Middleware.Connector 命名空间。
- 下一步是创建一个类,作为 .Net 应用程序和 SAP 之间的中间人。此类将负责使用 SAP 连接器连接到 SAP 服务器,发送数据和获取数据。添加一个名为 SAPConnectorInterface 的新类。添加 using SAP.Middleware.Connector 命名空间,因为它也将使用 SAP 连接器 DLL。
- 让我们创建一个测试连接,以检查您是否能够连接到 SAP。RfcDestination 类有一个 Ping() 方法,如果应用程序和 SAP 之间的连接已建立,则可以成功 ping 通。如果无法建立连接,它将抛出异常。
- 现在是时候调用 SAP RFC 来获取客户数据了。在开始此过程之前,请与您的 SAP 团队成员联系,获取他们编写的可用 RFC。同时检查他们是否返回数据。RFC 仅在参数中返回数据,就像在方法调用中使用“out”关键字一样。SAP 中的输入参数称为 IMPORT,值作为 EXPORT 参数返回。
- RFC 目标有一个 Repository。此存储库包含复杂的 RFC 函数和 RFC 结构。有时您会发现,在 SAP 端,他们有一个复杂的 IRfcStructure 包含 IRfcFunction,反之亦然。这些函数返回一个复杂的表结构,称为 IRfcTable,您需要将其转换为 ADO.Net Table。不幸的是,SAP.Net 连接器没有提供任何默认方法。请使用以下方法将 IRfcTable 转换为 DataTable:
- 创建一个名为 GetCustomers 的方法,它有两个输入参数:country 和 destination name。
创建 RFCRepository 的实例,其中包含所有函数。
rfcRepository = rfcDestination.Repository;
使用此存储库调用 CreateFunction 方法,并提供您需要调用的 SAP 的 RFC 名称。您需要确保 SAP 中存在确切的函数名称。
rfcFunction = rfcRepository.CreateFunction("RFC_CUSTOMER_DATA");
RFC 函数的输入参数如下传递。它类似于键值对。COUNTRY 应该作为 SAP 端 RFC 中的参数可用。
rfcFunction.SetValue("COUNTRY", country);
使用此行调用函数:
rfcFunction.Invoke(rfcDestination);
您会注意到这里调用了 rfcDestination,它包含了 SAP 连接器调用 SAP RFC 所需的所有信息。
有时您会发现 RFC 返回的结构包含许多 RFC 函数,每个函数都有不同的 RFC 表。这需要这样提取:
这是一个非常简单的示例。您可以使用 rfcFunction.SetValue 方法向 RFC 发送多个参数。**RfcFunction.Invoke(rfcDestination)** 是 .Net 应用程序实际调用 SAP 函数的行。
您会注意到,如果放置一个调试断点,当您向 SAP 发送大量数据,并且 SAP 函数很复杂并在其端执行许多操作时,调试会暂停一段时间,然后才会移动到下一行调试。这一行实际上在等待调用返回到您的应用程序。
RegisterDestinationManager 类还有一个方法 **RfcDestinationManager.UnregisterDestinationConfiguration(destinationConfig)**,但您很少需要使用它。
关注点
历史