C# 使用SAP的分步教程。带VS 2008的网络连接器
我在互联网上找到了很多例子,但很多都是老的(VS2003,SAP.Net Connector 2.0,当前版本是3.0) 我想知道如何使用SAP。网络连接器 我应该安装哪些文件 添加到项目中的引用 如何添加提供程序以在服务器资源管理器中创建连接?使用vs2010和SAP.NET Connector 3.0的示例 要求: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(您通常可以从手头项目的客户处获得它) 装置 为您的平台确
- Visual Studio.NET 2010(免费的c#速成版就可以了)
- SAP.NET Connector 3.0(您通常可以从手头项目的客户处获得它)
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表。在熟悉的.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);
}
}
}
笔记
- 虽然此示例基于vs2010,但其他VisualStudio版本应该可以正常运行
- 连接器中的SAP函数名称似乎应始终为大写
- 如果SAP Connector体系结构错误,例如安装64位版本,然后尝试编译32位x86,则会出现如下错误:无法加载文件或程序集“sapnco,版本=3.0.0.42,区域性=中性,PublicKeyToken=50436dca5c7f7d23”或其依赖项之一。试图加载格式不正确的程序。“这是正常的,只需安装正确的版本
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;