优化数据库访问以进行数据检索

时间:2014-01-30 18:33:09

标签: dynamics-ax-2009 axapta

对于多个数据插入,我们有一个有效的方法:RecordSortedList

RecordSortedList rsl;
MyTable          myTable;
;
rsl = new RecordSortedList(myTable.tableid);
rsl.sortOrder(fieldname2id(myTable.tableId,'RecId'));
myTable.field1 = 'Value1';
rsl.ins(myTable);
myTable.field1 = 'Value2';
rsl.ins(myTable);
rsl.insertDatabase();

同样可以从db一次性检索多个记录吗?像

这样的东西
int i =1;
while(i<10000)
{
  //enter records from db into a buffer in db
  i++
}
//now bring the buffer from db in a single trip 
//and do the data manipulation in AX

我的目的是优化数据库之旅。 请建议。

2 个答案:

答案 0 :(得分:2)

是的,它被称为RecordLinkList - http://msdn.microsoft.com/en-us/library/aa643250(v=ax.50).aspx

  

recordLinkList是一个可以保存记录的双链表   不同类型的同时。它没有键入或排序。

     

recordLinkList对于传递记录特别有用   不同的表作为参数而不是检索相同的记录   试。

     

recordSortedList的大小没有限制;它是   程序员有责任控制其规模,因此,   记忆消耗。

您还可以添加不同类型的记录。

static void RecordLinkList(Args _args)
{
    RecordLinkList      rll = new RecordLinkList();
    SalesTable          salesTable;
    CustTable           custTable;
    InventTrans         inventTrans;
    Address             address;
    boolean             iterate;
    ;

    select firstonly salesTable;
    select firstonly custTable;
    select firstonly inventTrans;
    select firstonly address;

    rll.ins(salesTable);
    rll.ins(custTable);
    rll.ins(inventTrans);
    rll.ins(address);


    iterate = rll.first();

    while (iterate)
    {
        switch (rll.fileId()) // FileId == TableId
        {
            case tablenum(SalesTable):
                salesTable = rll.peek();
                info(strfmt("SalesTable");
                break;

            case tablenum(CustTable):
                custTable = rll.peek();
                info("CustTable");
                break;

            case tablenum(InventTrans):
                inventTrans = rll.peek();
                info("InventTrans");
                break;

            default:
                error(strfmt("Table %1 (%2) not expected", tableid2name(rll.fileId()), rll.fileId()));
        }

        iterate = rll.next();
    }

    info("Done");



}

答案 1 :(得分:1)

如上所述的insertDatabase方法(如果您不需要排序顺序,请使用RecordInsertList类而不是RecordSortedList):

  

在一次数据库中插入多条记录。

然而,这主要来自程序员的观点。 SQL goes like this中的操作:

INSERT INTO MyTable ( Column1, Column2 ) 
VALUES ( Value1, Value2 ), 
       ( Value1, Value2 ), ...

以这种方式插入的记录数量有限制,因此AX内核可能会拆分列表以对SQL服务器进行多次调用。

从DB到AX的另一种方式很简单:

while select myTable where ...

将其翻译为SQL:

SELECT T1.Column1, T1.Column2 FROM MyTable T1 WHERE...

这会将表中的数据尽可能高效地传输到AX

您可以选择使用QueryRun对象,但对SQL的调用保持不变。

如果您对表执行简单更新,请考虑使用update_recordset,因为这可能会将更新移至SQL服务器并消除往返。