ASP.NET连接到BaaN与BOBS

用.net去开发BaaN的应用,现在大概有这么几种方法:

1)直接连接BaaN的数据库。(风险很大,只有小公司会使用这种方法)
2)把BaaN的数据通过Exchange导出,然后导入到SQL server,这些动作都做成Job,再从SQL server抓取有用的数据进行开发。(数据不及时,不准确)
3)通过BaaN的客户端直接调用BaaN的函数、过程或方法。获取自己想要的数据。(只能做成桌面版,一个application,在同一时间,只能使用一次调用,如果做成web版的,有两个以上用户同时浏览数据,就会出错。)

可能还有更好的方法,我暂时还没有想到。

前几天,在baanboard上看到一篇文章,有人开发了一个Baan OLE Broker Server (BOBS),解决了同一个application在同时只能调用BaaN的函数一次的问题,可以同时重复调用BaaN的函数或方法。

如果你有BaaN的开发权限,可以考虑去用这个方法去调用BaaN的资料去web上秀出来。

BOBS的资料和介绍,可以去http://www.baanboard.com/node/1736下载。

BOBS的使用经验,供大家参考:

1)下载BOBS后,首先修改BaaNOleBrokerServer.config文件里面的配置,目前BOSS只支持两个版本的BaaN系统,IV和V。对LN还不支持。把BaaNVersion的值改为自己所使用的版本。

<projectSettings>
….
<add key="BaaNVersion" value="V" />
</projectSettings>

 其他的设置要根据自己的IIS的设置去配置。

运行程序,当出现下面的界面,恭喜你,可以使用了。

2)然后可以建一个web应用在你所配置的IIS上。
把web.config里面的appsettings加上
  <appSettings>
    <add key="ServerIP" value="实际服务器IP" />
    <add key="ServerPort" value="32001" />
 </appSettings>

3)当然,最主要还是要有BaaN的开发权限。
通过session ttadv2539m000新建DLL,在里面写你要调用的函数。然后编译。
我找了一个已经存在的DLL,是BaaN的标准DLL,whwmddll0007,里面可以查看某一颗料在某个仓库是否有库存,如果有,则返回TRUE,否则返回FALSE。
下面的程序仅供参考。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections;

public partial class inventory : System.Web.UI.Page
{
    public enum STATE { CONNECT, PROCESS_SESSION, DISCONNECT };
    private STATE m_processState = STATE.CONNECT;

    public String ReceivedData = "", BaaNParameters = "", BaaNCommand = "";

    private int size = 0;
    private byte[] data = new byte[128];
    public Socket clientSocet;

    public static String ServerIP = ConfigurationManager.AppSettings["ServerIP"].ToString();
    public static int ServerPort = Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"].ToString());
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_submit_Click(object sender, EventArgs e)
    {
        open_connection();

        if (m_processState == STATE.PROCESS_SESSION)
        {
            BaaNParameters = ‘"’ + TextBox_wh.Text.ToString().Trim() + "","" + TextBox_item.Text + """;;

            BaaNCommand = "owhwmddll0007|whwmd.dll0007.item.present.in.warehouse(" + BaaNParameters + " )rn";
            clientSocet.Send(Encoding.Default.GetBytes(BaaNCommand));
            size = clientSocet.Receive(data);
            Label_size.Text = Encoding.Default.GetString(data, 0, size);
        }

    }

    private void open_connection()
    {
        String ClientID = "owhwmddll0007|dll0007.end()|" + DateTime.Now + "rn";
        // The firs part(before the first pipe) is the dll name, in the midle is the end function when running
        // an API session, and at the end, just the time

        clientSocet = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            clientSocet.Connect(new IPEndPoint(IPAddress.Parse(ServerIP), ServerPort));
            m_processState = STATE.CONNECT;
        }
        catch
        {
            m_processState = STATE.DISCONNECT;
            //news
        }

        if (m_processState != STATE.DISCONNECT)
        {
            // Send the Client ID.
            clientSocet.Send(Encoding.Default.GetBytes(ClientID));
            m_processState = STATE.PROCESS_SESSION;
            try
            {
                clientSocet.ReceiveTimeout = 60000;
                size = clientSocet.Receive(data);
                Label_size.Text = Encoding.Default.GetString(data, 0, size);
            }
            catch (Exception re)
            {
                m_processState = STATE.DISCONNECT;
                Label_size.Text = "Error receiving data from server " + re.Message;

   &nb
sp;        }
            ReceivedData = Encoding.Default.GetString(data, 0, size);
            if (ReceivedData != "OK")
            {
                m_processState = STATE.DISCONNECT;
            }
        }

    }
}