版权为我的学生王变宏
Microsoft Visual Studio® 2005 下使用DataProviderSAP 调用SAP RFC
1. DataProviderSAP. 安装:
执行安装文件进行安装DataProviderSAP.msi,默认安装路径:
C:\Program Files\Common Files\Microsoft Shared\Adapters\ SAP\。
2.Microsoft Visual Studio® 2005新建项目:
添加引用Microsoft.Adapter.SAP.SAPProvider.dll。
Microsoft.Adapter.SAP.SAPProvider.dll从以下安装路径查找:
C:\Program Files\Common Files\Microsoft Shared\Adapters\ SAP\。
3.C# 调用FRC语句:
using Microsoft.Adapter.SAP;//添加引用
SAPConnection con = new SAPConnection("ASHOST=10.1.10.102; CLIENT=200;SYSNR=00;USER=***;PASSWD=***;LANG=zh");//SAP服务器连接参数设置,
con.Open();
SAPCommand cmd = new SAPCommand(con);
cmd.CommandText = "EXEC BAPI_CUSTOMER_GETLIST @IDRANGE=@param OUTPUT";//执行远程RFC BAPI_CUSTOMER_GETLIST,执行RFC的参数传递过程参考下边的EXEC 语句的语法
//以下为RFC调用参数赋值并指定Input、Output类型
SAPParameter param = new SAPParameter("@param", ParameterDirection.InputOutput);
DataTable dt = new DataTable();
dt.Columns.Add("SIGN");
dt.Columns.Add("OPTION");
dt.Columns.Add("LOW");
dt.Columns.Add("HIGH");
DataRow row = dt.NewRow();
row["LOW"] = 1;
row["HIGH"] = 1000;
dt.Rows.Add(row);
param.Value = dt;
cmd.Parameters.Add(param);
//执行结果放在SAPDataReade中
SAPDataReader dr = cmd.ExecuteReader();
//retrieving returned datareaders
do
{
Console.WriteLine("value of returned datareader: " + dr.GetSchemaTable().TableName);
while (dr.Read())
{
string line = "";
for (int i = 0; i < dr.FieldCount; i++)
line = line + "| " + dr.GetValue(i).ToString();
Console.WriteLine(line);
}
}
while (dr.NextResult());
Console.WriteLine("Checking returned value of parameter @IDRANGE...");
DataTable dt1 = (DataTable)param.Value;
foreach (DataRow row1 in dt1.Rows)
{
string line = "";
for (int i = 0; i < dt1.Columns.Count; i++)
line = line + "| " + row1[i].ToString();
Console.WriteLine(line);
}
4.EXEC 语句的语法
以下几节介绍了针对该提供程序实现 EXEC 语句的语法规范。请注意,在某些情况下,该语法与 Transact-SQL 语法稍有不同。
4.1 EXEC 语法
EXEC rfc_name
[{value | @variable [OUTPUT]}][,...n]
[@parameter = {value | @variable [OUTPUT]}][,...n] [;]
其中:
rfc_name 指定要执行的函数调用的名称。
parameter 指定函数接口中定义的参数名。
value 指定参数值。
@variable 指定替换参数。使用 DbParameter 接口可以绑定参数值。
output 指定 SAP RFC 参数为 Output 或 InputOutput。
4.2 处理命名参数和未命名参数
以下内容是在 EXEC 查询中指定命名参数和未命名参数的准则:
1. 在指定参数时,可以通过命名这些参数(例如,@parameter_name=value)来指定参数,也可以只提供值。
2. 当使用默认值定义参数时,可以在不指定参数的情况下执行该操作。
3. 当使用 @parameter_name=value 格式时,则无需按照函数调用中所定义的顺序来提供参数名和常数。
4. 未命名参数的所需顺序如下所示:
o IMPORT (Input)
o EXPORT (Output)
o TABLE (InputOutput)
但是,排序是在参数类型内按照上面所列顺序进行的。例如,您有 6 个未命名参数,这 3 种参数类型各两个,如下表所示,参数排序应为 param1、param2、param3、param4、param5、param6。
IMPORT 参数 |
EXPORT 参数 |
TABLE 参数 |
param1 |
param3 |
param5 |
param2 |
param4 |
param6 |
5. 使用未命名参数时,您需要指定所有参数(包括可选参数和必选参数)的值。只有当可选参数出现在参数列表的末尾时,才可以省略它们。不支持使用“Default”或空格跳过可选参数,如下面示例所示:
EXEC Proc_Test_Defaults , 'A';
请改用下列语法以获取所需的结果:
EXEC Proc_Test_Defaults @p2='A';
6. EXEC 查询不支持使用具有下列属性的参数:
o 嵌套结构(包含其他结构作为其字段的结构)。
o 嵌套表。
o 包含结构的表。
o 包含表的结构。
o 字段中包含复合字符串类型(例如 SSTRING 或 RAWSTRING)的结构或表。
7. 下表列出了执行 RFC 时 RFC 参数类型与参数方向之间的逻辑映射:
PFC 参数类型 |
查询关键字 |
参数方向 |
Import 参数 |
无 |
Paramdirection.Input |
Export 参数 |
Output |
Paramdirection.Output |
Table 参数 |
Output /无 |
InputOutput |
8.
9. 以下内容是处理参数的一般准则:
a. 您可以将参数值指定为常数,也可以通过在查询中使用占位符来指定参数值。
b. 在查询中使用占位符时,必须创建 SAPParameter 对象并将其添加到相应的命令对象中。然后,将占位符的名称传递到构造函数中;方向和值取决于上下文。
§ 对于 Input 参数,请不要在查询中指定参数方向的关键字。但必须设置该参数对象的 value 字段,否则该提供程序将引发异常。请一定不能显式设置该参数对象的 direction 字段,因为该提供程序的默认设置为 Input。
§ 对于其他参数,请使用格式 @paramname=@placeholder 并在查询中显式指定 Output 关键字。然后,您必须添加与占位符相对应的 SAPParameter 并根据参数类型将参数方向显式设置为 ParamDirection.Output 或 ParamDirection.InputOutput。
c. 参数名称和占位符名称不区分大小写。
d. 除非参数具有不同的方向,否则它们的名称不能在查询中重复。
e. 占位符名称不能在查询中重复。
4.3 EXEC 语句示例
· 若要执行不带输入参数的 BAPI,请使用以下语法;数据通过 DataReader 对象返回:
· EXEC BAPI_COMPANYCODE_GETLIST
· 若要执行带有输入参数的 RFC,请使用以下语法:
· Exec RFC_CUSTOMER_GET @NAME1='Contoso'
· 若要执行带有指定的输入参数但没有参数名称的 RFC,请使用以下语法:
· Exec RFC_CUSTOMER_GET '*', 'Contoso'
· 若要执行带有指定为变量的输入参数的 RFC,请使用以下语法:
· Exec RFC_CUSTOMER_GET @var
在此示例中,必须创建名为 @var 的参数,并显式设置该参数的值(例如,设置为“1001”),原因是 RFC_CUSTOMER_GET 的第一个参数对应于 KUNNR(客户号)。
· 若要执行使用变量作为输入参数名称的 RFC,请使用以下语法:
· Exec RFC_CUSTOMER_GET @KUNNR=@var1, @NAME1='Contoso'
您必须创建名为 @var1 的 SAPParameter,指定它的值,然后将它绑定到对应的命令对象。新创建的参数对象的默认方向为 input。
· 若要执行 BAPI,并将表作为参数返回,请使用以下语法:
· EXEC BAPI_COMPANYCODE_GETLIST @ COMPANYCODE_LIST=@tableVar OUTPUT
您必须创建名为 @var1 的 SAPParameter,指定它的值,然后将它绑定到对应的命令对象。新创建的参数对象的方向应为 InputOutput。
附: