27

我在 Internet 上找到了很多示例,但很多都是旧的(VS 2003,SAP.Net Connector 2.0,当前为 3.0)。

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

我应该安装哪些文件?

添加到项目中的引用?

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

4

1 回答 1

86

使用 vs2010 和 SAP .NET 连接器 3.0 的示例

要求:

  • Visual Studio .NET 2010(免费的 c# Express 版很好)
  • SAP .NET 连接器 3.0(您通常可以从您的客户处为手头的项目获取它)

安装

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

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

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

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

参考

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

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

.. 然后,选择Browse选项卡,导航到 SAP 连接器安装文件夹,然后同时选择sapnco.dllsapnco_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_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表。有一个方便的扩展可以在熟悉的 .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;

笔记

  • 虽然此示例基于 vs2010,但其他 Visual Studio 版本应该可以正常运行。
  • 似乎连接器的 SAP 函数名称应始终为大写。
  • 如果你弄错了 SAP 连接器架构,例如你安装了 64 位版本,然后尝试为 32 位 x86 编译,你会得到一个错误,比如:“Could not load file or assembly 'sapnco, Version=3.0.0.42, Culture =neutral, PublicKeyToken=50436dca5c7f7d23' 或其依赖项之一。试图加载格式不正确的程序。” 这个是正常的; 只需安装正确的版本。

附加阅读

于 2014-02-14T19:08:27.210 回答