一开始博客使用NC3.0,结果报错SAP.Middleware.Connector.RfcDestinationManager”的类型初始值设定项引发异常
后来使用新的办法已经测试成功
操作步骤:
1.安装SAP客户端
2..net引入DLL
3.在新的进程中运行,否则报错
进程类型为STA
thread.SetApartmentState(System.Threading.ApartmentState.STA);
4.附上代码
public class RFCLINK
{
SAPLogonCtrl.Connection connction;
public void Request(string rfcName, Dictionary<string, string> dictParameter, ref DataTable outputTable)
{
if (Link())
{
SAPFunctionsOCX.SAPFunctions func = new SAPFunctionsOCX.SAPFunctions();
func.Connection = connction;
SAPFunctionsOCX.IFunction ifunc1 = (SAPFunctionsOCX.IFunction)func.Add(rfcName);
//这里是传入值参数
foreach (var item in dictParameter.Keys)
{
SAPFunctionsOCX.IParameter zaufnr = (SAPFunctionsOCX.IParameter)ifunc1.get_Exports(item);
zaufnr.Value = dictParameter[item];
}
//SAPFunctionsOCX.IParameter parameter = (SAPFunctionsOCX.IParameter)ifunc1.get_Exports("P_MBLNR");
//parameter.Value = "2910424194";
if (ifunc1.Call())
{
SAPTableFactoryCtrl.Tables bcENQs = (SAPTableFactoryCtrl.Tables)ifunc1.Tables;
SAPTableFactoryCtrl.Table cyRESB = (SAPTableFactoryCtrl.Table)bcENQs.get_Item(outputTable.TableName);
if (cyRESB.RowCount > 0)
{
for (int i = 1; i <= cyRESB.ColumnCount; i++)
{
outputTable.Columns.Add(cyRESB.get_ColumnName(i));
}
for (int ii = 1; ii <= cyRESB.RowCount; ii++)
{
DataRow dr = outputTable.NewRow();
for (int i = 1; i <= cyRESB.ColumnCount; i++)
{
string H = cyRESB.get_Cell(ii, i).ToString();
dr[i - 1] = H;
}
outputTable.Rows.Add(dr);
}
//int bb = bcENQs.Count;
//string cc = bcENQs.get_Item("R_ITAB").ToString();
调用函数
//int aa = cyRESB.RowCount;
//string f = cyRESB.get_Cell(1, "DO").ToString();
//string p = cyRESB.get_Cell(1, "MODELPART").ToString();
}
//退出登陆
connction.Logoff();
}
}
}
private bool Link()
{
try
{
bool IsOk = false;
SAPLogonCtrl.SAPLogonControl login = new SAPLogonCtrl.SAPLogonControl();
login.ApplicationServer = DAL.Constant.SAPIP;
login.Client = Constant.SAPClient;
login.Language = Constant.Language;
login.User = Constant.SAPAcc;
login.Password = Constant.SAPPwd;
connction = (SAPLogonCtrl.Connection)login.NewConnection();
if (connction.Logon(0, true))
{
IsOk = true;
}
else
{
IsOk = false;
}
return IsOk;
}
catch (Exception)
{
throw;
}
}