在本地类与外部类中使用 SAPbobsCOM.Company 时的性能

问题描述 投票:0回答:1

我使用此代码将数据从 SAP DI(SQL 查询)加载到数据表:

namespace SAPApp
{
    class SAPData
    {
    public void GetSAPData(Company oCompany)
        {
            if (oCompany.Connected)
            {
                dt.TableName = _TableName;
                DataColumn dtColumn;
                DataRow dtRow;

                Cursor.Current = Cursors.WaitCursor;
                SAPbobsCOM.Recordset oRecordSet;

                oRecordSet = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
                oRecordSet.DoQuery(SQL); 
                oRecordSet.MoveFirst();

                dt.BeginLoadData();
                int colCount = oRecordSet.Fields.Count;

                for (int i = 0; i < colCount; i++)
                {
                    string colName = oRecordSet.Fields.Item(i).Name;
                    BoFieldTypes ftype = oRecordSet.Fields.Item(i).Type;
                    var dType = Type.GetType("System.String");
                    if (ftype == BoFieldTypes.db_Date)
                        dType = Type.GetType("System.DateTime");
                    else if (ftype == BoFieldTypes.db_Numeric)
                        dType = Type.GetType("System.Decimal");

                    dtColumn = new DataColumn()
                    {
                        DataType = dType,
                        ColumnName = colName,
                        Caption = colName,
                    };
                    dt.Columns.Add(dtColumn);
                }


                while (!oRecordSet.EoF)
                {
                    dtRow = dt.NewRow();
                    for (int i = 0; i < colCount; i++)
                        dtRow[i] = oRecordSet.Fields.Item(i).Value;
                    dt.Rows.Add(dtRow);
                    oRecordSet.MoveNext();
                }
                dv = new DataView(dt);
                dt.EndLoadData();

                Cursor.Current = Cursors.Default;
            }
        }

工作正常!当 SAPbobsCOM.company 和 Company.Connect() 在主表单(单一表单应用程序)中“本地”定义时,执行需要 0.222 秒。但是,当我将 SAPbobsCOM.company 对象移动到“外部”类时,相同的代码运行时间为 +22 秒(将应用程序移动到 MDI)。

本地声明:

namespace SAPApp
{
    public partial class FrmMain : Form
    {
        private readonly Company oCompany = new Company();
...

// Call in main form

SAPData SDAcc = new SAPData;
SDAcc.GetSAPData(oCompany);  // param: oCompany object

对外声明:

\\ First create a TSapDI with oCompany objet

namespace SAPApp.Commons
{
    public partial class TSapDI
    {
        public readonly Company oCompany = new Company();

\\ Then instantiate in Globals

namespace SAPApp.Commons
{
    internal class Globals
    {
        public static TSapDI SapDI = new TSapDI();

\\ Create method in Commons 

namespace SAPApp
{
    class SAPData
    {
    public void GetSAPData(Company oCompany)....

\\ Finally call it

SAPData SDSearch = new SAPData
SDSearch.GetSAPData(Globals.SapDI.oCompany); // param: Globals.SapDI.oCompany object

在第一种情况下,VisualStudio 可以检查 GetSAPData 内的 oCompany 对象,但在第二种情况下则不能。

有人可以帮助我理解为什么会出现这样的差异,如果可能的话如何解决它?谢谢。

附注我认为这与 oCompany 从静态对象变为非静态对象有关。

我需要在不到 1 秒的时间内执行代码。

c# performance winforms visual-studio-2019 sap-business-one-di-api
1个回答
1
投票

我找不到确切的原因,但我最终将代码更新为:

public static class TSapDI
{
    public static Company oCompany = new Company();

然后将所有引用从 Globals.SapDI.oCompany 更改为 TSapDI.oCompany,它在 0.222 秒内恢复运行:-D

PS 我需要更改一些其他内容才能允许此更改。

© www.soinside.com 2019 - 2024. All rights reserved.