winforms 当使用SAPbobsCOM.Company“本地”和“外部”时,这会导致C#和SAP DI API中的巨大性能差异

7kqas0il  于 2023-05-23  发布在  C#
关注(0)|答案(1)|浏览(170)

我使用以下代码将数据从SAP DI(SQL Query)加载到DataTable:

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对象,但在第二种情况下不能。
有人能帮助我理解为什么会有这样的差异吗?如果可能的话,如何解决这个问题?谢谢
P.S.我认为这与oCompany从静态对象变为非静态对象有关。
我需要在不到1秒的代码执行。

yvt65v4c

yvt65v4c1#

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

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

然后将所有引用从以下位置更改:Globals.SapDI.oCompany到TSapDI.oCompany,它在0.222秒内恢复运行:-D
PS我需要改变一些其他的东西来允许这种改变。

相关问题