使用 SAP 的分步教程。 VS 2008 的网络连接器 [关闭]

2024-02-01

我在互联网上找到了很多例子,但很多都是旧的(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 并创建一个新项目(或打开您自己的项目)。

In the Solution Explorer面板,通常在您的右侧,右键单击References并选择Add Reference:

..然后,选择Browse选项卡,导航到 SAP Connector 安装文件夹,然后选择两者sapnco.dll and sapnco_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_GETLISTSAP功能:

    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您可能喜欢或不喜欢的表。有一个方便的扩展可以将该表转换为熟悉的 .NETDataTable, 如下:

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/ 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;

Notes

  • 虽然此示例基于 vs2010,但其他 Visual Studio 版本应该可以正常运行。
  • It appears连接器中的 SAP 函数名称应始终为大写。
  • 如果您的 SAP Connector 架构有误,例如如果您安装 64 位版本,然后尝试编译 32 位 x86,您将收到如下错误:“无法加载文件或程序集“sapnco,Version=3.0.0.42,Culture=neutral,PublicKeyToken=50436dca5c7f7d23”或其依赖项之一。尝试加载格式不正确的程序。”这个是正常的;只需安装正确的版本即可。

补充阅读

  • http://service.sap.com/connectors http://service.sap.com/connectors
  • http://antswift.wordpress.com/2011/12/22/connecting-to-sap-and-retriving-data-using-version-3-0-of-the-sap-net-connector/ http://antswift.wordpress.com/2011/12/22/connecting-to-sap-and-retrieving-data-using-version-3-0-of-the-sap-net-connector/
  • http://www.codeproject.com/Tips/521485/SAP-Integration-with-Net-4-0-SAP-Connection-Manage http://www.codeproject.com/Tips/521485/SAP-Integration-with-Net-4-0-SAP-Connection-Manage
  • http://www.dataxstream.com/2011/11/nco-3-rfc-client-vb-net-step-by-step/ http://www.dataxstream.com/2011/11/nco-3-rfc-client-vb-net-step-by-step/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SAP 的分步教程。 VS 2008 的网络连接器 [关闭] 的相关文章

随机推荐

  • 如何在 Ruby 中实现 Pubnub 存在功能

    我想知道如何在 Rails 应用程序中使用 PubNub 实现用户存在 但我没有找到有关如何在服务器端和客户端实现此功能的完整指南 使用 Ruby 和 JavaScript 实现 PubNub 存在 按照这个连接两个 PubNub SDK
  • CGContextSetBaseCTM 无效上下文 0x0

    我目前正在开发一个 Java 应用程序 由于我没有OSX我已经从该应用程序所在的论坛 社区中寻求了一些人的帮助 但是在启动应用程序时会出现此错误OSX Oct 5 15 26 58 macbook pro local java 2384
  • JSTL .tld 文件在哪里?

    我已经下载了jstl 1 1 2 jar http repo1 maven org maven2 jstl jstl 1 1 2 jstl 1 1 2 jar来自 Maven 存储库 我希望 jar 包含标签的 tld 文件 但事实并非如此
  • 对facet_grid 图的所有方面强制启用X 轴文本

    我有同样的问题该用户 https stackoverflow com questions 10913840 force x axis on both graphs in a facet grid when x values are the
  • Cocoa - 从另一个可变参数方法调用可变参数方法(NSString stringWithFormat 调用)

    我有一个问题 NSString strigWithFormat format 因为它返回一个 id 并且我有很多代码将 NSString var 更改为其他个人类型 但编译器不会阻止我在某些地方将 NSString 设置为另一种类型的对象
  • 如何使用自定义编辑器属性从任何地方获取屏幕点击输入?

    TL DR 如何使用矢量实现 Unity 的 屏幕颜色 功能 好吧 对于我想要做的事情来说 标题非常简单 让用户单击一个按钮 然后单击屏幕上的一个位置 将该 世界 位置保存为矢量 这基本上是有效的 但它不会检测到检查器之外的左键单击 禁用统
  • fancybox2 / fancybox 导致页面跳转到顶部

    我已经在开发网站上实现了 fancybox2 当我使用 fancybox 单击链接等 时 整个 html 会移到它后面 并转到顶部 我让它在另一个演示中运行良好 但是当我将相同的代码拖到这个项目时 它会跳到顶部 不仅包含内联 div 的链接
  • 保留值直到 Teradata 中的值发生变化

    Teradata中有一个交易历史表 其中余额仅在有交易时才会更改 数据如下 Cust id Balance Txn dt 123 1000 27MAY2018 123 350 31MAY2018 例如 对于 5 月 27 日的客户 123
  • 使用 StrictMode 检测 Android 上被遗忘的 SQLite 事务?

    执行多个 SQL 语句而不将它们放入一个事务中是一个严重的瓶颈 参见例如http www sqlite org faq html q19 http www sqlite org faq html q19 我还没有彻底检查 SQLite 在
  • Tkinter GUI、I/O 和线程:何时使用队列、何时使用事件?

    我正在使用 TKinter 构建一个 GUI 用于与多通道分析仪的套接字连接 以定期 约 15 秒 接收和绘制数据 约 15 000 000 个值 在接收数据时 我不希望 GUI 冻结 因此我使用多线程进行连接处理 数据接收和绘图操作 正如
  • 使用 scala 使用用户名和密码进行 SSH

    有没有一种方法可以让我们在通过 scala 代码执行 ssh 时提供用户名和密码 这是我现在正在使用的代码 但我不知道如何在 HostConfig 中提供用户和密码 SSH 采用 HostConfigProvide https github
  • 使用命令行删除逗号之间的空格

    如果我有一个像这样的文件 1050505 Some Customer 1 1 Some Order 5 6 Item 1050505 Some Customer 1 1 Some Order 5 6 Item 1050505 Some Cu
  • 创建一个可以运行的DLL

    Windows 有一个名为 rundll32 exe 的实用程序 可以将本机动态链接库作为应用程序执行 假设我有一段代码可以打印 Hello World 到控制台 是否可以用 C 最好是 Visual C 编写一个可以使用 rundll32
  • IIS 7 启用的协议

    我有一台 win 2008r2 服务器 默认网站已启用协议设置为 http net tcp 当在默认网站下创建任何新应用程序时 我希望默认具有相同的启用协议 有人可以建议如何做到这一点吗 目前 当我添加应用程序时 会创建一个仅启用 http
  • 在 python 中使用 opencv 更改图像中某个区域的颜色

    我有一张图片 我想将所有白色像素更改为灰色 但仅限于图像的特定区域 示例图片 我只想更改红色矩形之外的图片 而不更改红色矩形内的图像 我已经有了通用代码 这是其他人的 Stackoverflow 问题的一部分 它改变每个白色像素的颜色 而不
  • 如何将 Span 添加到散景中的图例?

    因此 我创建了一个带有一些线条和一个跨度 或多个跨度 的图形 f figure f line x y1 legend label 1st set f line x y2 legend label 2st set vl Span locati
  • 如何将文本文件导入打字稿?

    作为一个最小的例子 我想将一个文本文件导入打字稿并将其打印到控制台而不使用读取它fs 像这样的东西 import text from foo txt console log text 我发现了很多解决方案的例子 例如this one htt
  • 带有 JWT 和基本身份验证的 HttpListener:如何发送 WWW-Authenticate? (自托管)

    我有一个在 mono NET 上跨平台运行的自托管 REST 应用程序 一个问题是 HttpListener 管理并阻止 WWW Authenticate 标头的手动设置 如果您将自己限制为内置的 Basic NTLM 等身份验证 或者不需
  • findFragmentByTag - 在 FragmentTabHost 中查找片段 - 始终为 null

    我无法获取指向 Fragment 的指针 该 Fragment 是 FragmentTabhost 中当前可见的片段 我有一个SherlockFragmentActivity called SecondActivity从它加载 Tabhos
  • 使用 SAP 的分步教程。 VS 2008 的网络连接器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在互联网上找到了很多例子 但很多都是旧的 VS 2003 SAP Net Connector 2 0