NCO 3.0连接多个SAP地址

caodandongxi 2016-07-01 06:45:13
在一个项目中,需要同时连接两个SAP地址获取数据,但是只有第一个能有数据返回,第二个地址无数据返回。将先后顺序调转,还是只有第一个可以。请问这是什么情况,以下是主要代码
第一次调用:
NCO.ConnSap connSap = new ConnSap("地址1", "端口", "用户名", "密码", "02", "EN");
connSap.CreateConn();
dt = connSap.GetDataByRfc("RFC名称", paraValue, "PO", out res);

第二次调用
NCO.ConnSap connSap = new ConnSap("地址2", "端口", "用户名", "密码", "02", "EN");
connSap.CreateConn();
dt = connSap.GetDataByRfc("RFC名称", paraValue, "PO", out res);
后台代码:


public class ConnSap
{
private string Server { get; set; }
private string Client { get; set; }
private string User { get; set; }
private string PassWord { get; set; }
private string SysNumber { get; set; }
private string Language { get; set; }

private RfcConfigParameters rfcPar = null;
private RfcDestination dest = null;
private RfcRepository rfcrep = null;

/// <summary>
/// 構造函數
/// </summary>
/// <param name="server">SAP地址</param>
/// <param name="client">客戶端號</param>
/// <param name="user">用戶名</param>
/// <param name="passWord">密碼</param>
/// <param name="sysNumber">system number</param>
/// <param name="language">語言</param>
public ConnSap(string server,string client,string user,string passWord,string sysNumber,string language)
{
Server = server;
Client = client;
User = user;
PassWord = passWord;
SysNumber = sysNumber;
Language = language;
}

//初始化,便於多次調用不同的RFC
public string CreateConn()
{
string res = "OK";
try
{
#region 此段代碼作用為將各個參數寫入config文件中,再讀取,生成樣例如下
#region 生成config代碼段樣例
//<configuration>
// <configSections>
// <sectionGroup name="SAP.Middleware.Connector">
// <sectionGroup name="ClientSettings">
// <section name="DestinationConfiguration" type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/>
// </sectionGroup>
// </sectionGroup>
// </configSections>
// <SAP.Middleware.Connector>
// <ClientSettings>
// <DestinationConfiguration>
// <destinations>
// <add NAME="Conn" USER="SFC_USER" PASSWD="yhpwd" CLIENT="801" SYSNR="02" ASHOST="10.134.28.85" LANG="EN" GROUP="PUBLIC" MAX_POOL_SIZE="5"></add>
// </destinations>
// </DestinationConfiguration>
// </ClientSettings>
// </SAP.Middleware.Connector>
//</configuration>
#endregion

rfcPar = new RfcConfigParameters();
rfcPar.Add(RfcConfigParameters.Name, "CON");
rfcPar.Add(RfcConfigParameters.AppServerHost, this.Server);
rfcPar.Add(RfcConfigParameters.Client, this.Client);
rfcPar.Add(RfcConfigParameters.User, this.User);
rfcPar.Add(RfcConfigParameters.Password, this.PassWord);
rfcPar.Add(RfcConfigParameters.SystemNumber, this.SysNumber);
rfcPar.Add(RfcConfigParameters.Language, "EN");

dest = RfcDestinationManager.GetDestination(rfcPar);
#endregion
rfcrep = dest.Repository;
}
catch (Exception ex)
{
res = ex.Message;
}

return res;
}

/// <summary>
/// 通過RFC獲取數據
/// </summary>
/// <param name="rfcName">RFC名稱</param>
/// <param name="param_value">RFC所需參數&值</param>
/// <param name="outTable">RFC返回表名稱</param>
/// <returns></returns>
public DataTable GetDataByRfc(string rfcName,Dictionary<string,string> param_value,string outTable,out string res)
{
res = "OK";
//提前实例化一个空的表结构出来
DataTable dt = new DataTable();

try
{
IRfcFunction myfun = null;

#region 示例
//myfun = rfcrep.CreateFunction("ZRFC_GET_PRO_HEADER1");
//myfun.SetValue("PLANT", "GHUE"); //SAP里面的传入参数
//myfun.SetValue("PO_NO", "000654186308"); //SAP里面的传入参数
//IRfcTable irfTable = myfun.GetTable("PO");
#endregion

myfun = rfcrep.CreateFunction(rfcName.Trim());

foreach (string item in param_value.Keys)
{
myfun.SetValue(item, (object)param_value[item]);
}

myfun.Invoke(dest);
IRfcTable irfTable = myfun.GetTable(outTable);

int liElement = 0;
for (liElement = 0; liElement <= irfTable.ElementCount - 1; liElement++)
{
RfcElementMetadata metadata = irfTable.GetElementMetadata(liElement);
dt.Columns.Add(metadata.Name.ToString()); //循环创建列
}
foreach (IRfcStructure dr in irfTable) //循环table结构表
{
DataRow row = dt.NewRow(); //创建新行
for (liElement = 0; liElement <= irfTable.ElementCount - 1; liElement++)
{
RfcElementMetadata metadata = irfTable.GetElementMetadata(liElement);
row[metadata.Name] = dr.GetString(metadata.Name).Trim();
}
dt.Rows.Add(row);
}
}
catch (Exception ex)
{
res = ex.Message;
}

return dt;
}

}
...全文
1056 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘欣的博客 2016-08-22
  • 打赏
  • 举报
回复
3.0 是写配置文件,我是这样用的,可以连接多个服务器

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧