c#连接SAP新方式

  一直以来连接sap bapi都非常慢,但是最近有项目需要连接SAP,但是要求速度上有要求,于是我就在网上搜索了一番,终于给我发现一个sapnco3.0这一个东西,用了之后发现速度非常不错,第一次连接速度不算快,但是第二次连接就速度可以算秒连了,更加让我兴奋的是居然服务器不需要安装sap就可以连接sap,哈哈,我简直兴奋不已了

   1.安装Setup_ntintel_302.msi

 2.在C:\Program Files (x86)\SAP\SAP_DotNetConnector3_x86发现了4个文件,当然在自己的.net项目中全部引用这个4个dll啦,不过,抱歉,好像只能其中2个能

引用成功,哈哈,没有关系,不影响使用

  引用完了,当然是封装自己喜爱的类啦

 

using SAP.Middleware.Connector;
namespace JcWeb.CLass
{
    public class SapClass
    {
        public RfcConfigParameters rfc { get; set; }
        public RfcDestination rfcdest { get; set; }
        public RfcRepository rfcrep { get; set; }
        public IRfcFunction myfun { get; set; }

        public bool open()
        {
            try
            {
                //都是一句话,根据自己实际情况填,哈哈,为了不暴露公司sap相关信息,参数都以*替代
                rfc = new RfcConfigParameters();
                rfc.Add(RfcConfigParameters.Name, "*");//sap名字
                rfc.Add(RfcConfigParameters.AppServerHost, "*");//SAP服务器IP
                rfc.Add(RfcConfigParameters.Client, "*");//端口
                rfc.Add(RfcConfigParameters.User, "*");//用户名
                rfc.Add(RfcConfigParameters.Password, "*");//密码
                rfc.Add(RfcConfigParameters.SystemNumber, "*");
                rfc.Add(RfcConfigParameters.Language, "EN");
                rfc.Add(RfcConfigParameters.PoolSize, "50");
                rfc.Add(RfcConfigParameters.MaxPoolSize, "100");
                rfc.Add(RfcConfigParameters.IdleTimeout, "5000");
                rfcdest = RfcDestinationManager.GetDestination(rfc);
                rfcrep = rfcdest.Repository;            }
            catch {
                return false;
            }
        }

        public List<JcWeb.Models.DnInfo> ZBAPI_SD_ZSDR135_T1_Output(List<string> dn){
            List<JcWeb.Models.DnInfo> data = new List<Models.DnInfo>();
             myfun = null; 
           
myfun = rfcrep.CreateFunction("ZBAPI_SD_ZSDR135_T1");//连接BAPI
          
  //如果输入参数不是一个表的话,以下方式设值
          
  //myfun.SetValue("AAA", "值");
           
//如果输入参数是一个表的话,以下方式设值
           
IRfcTable dntable = myfun.GetTable("DN");
           
foreach(var t in dn){
               
dntable.Insert();
               
dntable.CurrentRow.SetValue("VBELN", t);
          
  }
           
myfun.Invoke(rfcdest);//把数据返回SAP执行
          
     
       IRfcTable outtable = myfun.GetTable("T02");//返回数据的表格
   
         JcWeb.Models.DnInfo dndata;
for (var i = 0; i <= outtable.RowCount - 1; i++) { outtable.CurrentIndex = i; dndata=new Models.DnInfo(); dndata.Dn = outtable.CurrentRow.GetString("VBELN").ToString(); dndata.Batch = outtable.CurrentRow.GetString("CHARG").ToString(); dndata.custname = outtable.CurrentRow.GetString("NAME1").ToString(); dndata.Dnitem = outtable.CurrentRow.GetString("UEPOS").ToString(); dndata.liaohao_after = outtable.CurrentRow.GetString("MATNR").ToString(); dndata.liaohao_before = outtable.CurrentRow.GetString("MATNR1").ToString(); dndata.Qty = Convert.ToDouble(outtable.CurrentRow.GetString("KCMENG").ToString()); dndata.Rounding_Value = Convert.ToDouble(outtable.CurrentRow.GetString("SCMNG").ToString()); dndata.Sales_Office = outtable.CurrentRow.GetString("VKBUR").ToString(); dndata.Sales_Org = outtable.CurrentRow.GetString("VKORG").ToString(); if (outtable.CurrentRow.GetString("HSDATS").ToString() != "0000-00-00") { dndata.scdate = Convert.ToDateTime(outtable.CurrentRow.GetString("HSDATS").ToString()); } dndata.scpihao = outtable.CurrentRow.GetString("CHARGS").ToString(); dndata.shipto = outtable.CurrentRow.GetString("KUNNR").ToString(); dndata.soldto = outtable.CurrentRow.GetString("KUNAG").ToString(); dndata.taping_date = Convert.ToDateTime(outtable.CurrentRow.GetString("HSDAT").ToString()); data.Add(dndata); } return data; } } }

 根据自己的需求可以自己封装操作类啦,不要评价我的封装类,嘻嘻

不过到这里新的悲剧出现,这个插件真他妈的牛B,把我耍了大半天时间才知道什么回事

因为这个插件有时候会出现sap连接失败的,不过次数不多,一天偶尔发生一两次,不影响使用,其次我要重点说明下开发时候的问题

举个例子

 IRfcTable dntable = myfun.GetTable("DN");
            foreach(var t in dn){
                dntable.Insert();
                dntable.CurrentRow.SetValue("VBELN", t);
            }
            myfun.Invoke(rfcdest);
            IRfcTable outtable = myfun.GetTable("T02");

 假如你的BAPI里面没有T02这个表,好啦,你第一次使用这个插件开发,你就给他耍死你,不过有我指点你

假如你的BAPI里面没有T02这个表,报错代码不会停留在 IRfcTable outtable = myfun.GetTable("T02")这里的

他会在myfun = rfcrep.CreateFunction("ZBAPI_SD_ZSDR135_T1")这条代码这里提示说找不到这个BAPI

说到这里这个插件牛B不,还没有运行到下面的就知道下面代码出错了,害我白瞎搞白天,所以大家别给错误提示误导

我估计到这里,大家都明白怎样使用这个插件啦,下面是附上插件的下载地址

Hi,推荐文件给你 "sapnco30P_2-20007347.zip" http://vdisk.weibo.com/s/iEwEb

posted @ 2012-11-22 16:42  asdfas234  阅读(916)  评论(0编辑  收藏  举报