Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SAP的分步教程。带VS 2008的网络连接器_C#_.net_Sap Dotnet Connector - Fatal编程技术网

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

C# 使用SAP的分步教程。带VS 2008的网络连接器,c#,.net,sap-dotnet-connector,C#,.net,Sap Dotnet Connector,我在互联网上找到了很多例子,但很多都是老的(VS2003,SAP.Net Connector 2.0,当前版本是3.0) 我想知道如何使用SAP。网络连接器 我应该安装哪些文件 添加到项目中的引用 如何添加提供程序以在服务器资源管理器中创建连接?使用vs2010和SAP.NET Connector 3.0的示例 要求: Visual Studio.NET 2010(免费的c#速成版就可以了) SAP.NET Connector 3.0(您通常可以从手头项目的客户处获得它) 装置 为您的平台确

我在互联网上找到了很多例子,但很多都是老的(VS2003,SAP.Net Connector 2.0,当前版本是3.0)

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

我应该安装哪些文件

添加到项目中的引用

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

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

  • Visual Studio.NET 2010(免费的c#速成版就可以了)
  • SAP.NET Connector 3.0(您通常可以从手头项目的客户处获得它)
装置 为您的平台确定正确的版本。您可能有以下几点:

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

展开归档文件,并启动
.msi
安装文件

。。按照安装过程进行操作,保留所有默认选项(next..next..next..finish)

参考 打开Visual Studio并创建新项目(或打开自己的项目)

解决方案资源管理器
面板中,通常在右侧,右键单击
引用
,然后选择
添加引用

。。然后,选择
Browse
选项卡,导航到SAP连接器安装文件夹,并同时选择
sapnco.dll
sapnco_utils.dll

现在您已经在VisualStudio项目中正确引用了SAP.NET连接器,可以为其编写代码了

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

。。然后,连接到SAP并调用一个函数。假设您希望使用
BAPI\u COMPANYCODE\u 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);
        }
    }
}
笔记
  • 虽然此示例基于vs2010,但其他VisualStudio版本应该可以正常运行
  • 连接器中的SAP函数名称似乎应始终为大写
  • 如果SAP Connector体系结构错误,例如安装64位版本,然后尝试编译32位x86,则会出现如下错误:无法加载文件或程序集“sapnco,版本=3.0.0.42,区域性=中性,PublicKeyToken=50436dca5c7f7d23”或其依赖项之一。试图加载格式不正确的程序。“这是正常的,只需安装正确的版本
补充阅读

由于所选答案有0票,而此答案有12票以上,并且更准确地回答了问题,是否可以更改接受的答案?文档位于:需要一个sap用户。好的,但是sap用户是什么?如果您需要在一个流程中设置多个RFC服务器或RFC评估,您应该像地狱一样运行NCO是一个静态噩梦,尽管有带有内部集合的*Manager类,但它不允许这样做。
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);
        }
    }
}
// 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;