【问题标题】:datatables server side processing sql server with custom data带有自定义数据的数据表服务器端处理 sql server
【发布时间】:2018-08-23 02:24:37
【问题描述】:

我有一个大约 120k 记录的大型数据库,我编写了一个应用程序来与其数据进行交互,其中一部分是用来编辑它们的,我必须改进它,因为我从对话框中获取数据,如果我这样做应该会更好做内联。此应用程序是使用 jQuery - jQueryUI - Datatables 制作的。

为了避免主要选择中的大查询,我减少了提供大量数据的机会。服务器是一个 Windows 2008 R2,它运行一个带有 PHP 模块的 IIS 实例,该模块一开始配置为使用 256MB 内存运行,由于内存瓶颈,我已切换到 512MB,但我仍然遇到瓶颈记忆。测量它我注意到在一些查询中它需要更多的内存,大约 600MB,因此我留下了 memory_limit -1,所以是无限的。
实际上 PHP 中间件将结果集返回为 json,他进行了转换,需要双倍的内存。
如果我停留在与主题无关的解释中,我深表歉意,我这样做只是为了说明我的工作重点。
顺便说一句,我在编写应用程序时没有时间研究解决方案,但现在我有。
现在重点来了,sql server 2008 R2 没有实现查询选择的限制。
首先我在 sql server 中做了一个有限制的查询:
https://pastebin.com/8JZTAerE

DECLARE @RowsPerPage INT = 10, @PageNumber INT = 1
SELECT *
FROM
    (SELECT 
        myview.*,
        ROW_NUMBER() OVER (ORDER BY foo) AS RowNum
    FROM myview WHERE 1=1
     -- AND foo AND bar AND baz
    ) AS BDT
WHERE
    BDT.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
    AND @RowsPerPage*(@PageNumber)

为了使这个查询正常工作,我或 DataTables 必须传递一些参数,例如 RowsPerPage、PageNumber、排序标准和过滤字符串,它们允许您对返回的结果集进行第二次浏览。这就像一秒钟,因为您可以在进行主查询后的一秒钟内指定。也应该研究这个,因为一些示例对表的每个字段进行此过滤,但当然 DataTable 对结果集有两种类型的过滤:适用于每个字段的全局和适用于单个字段的本地,所以查询应该更复杂,并采取两段过滤。但是这个纯sql问题,PHP和DataTable都不在乎。 这个怎么做?在我发现的每个示例中,没有人在 ajax 调用中指定数据。我认为 DataTables 将其放入 post 数组中,但我需要指定,因为我必须传递我的参数。
这是我的 ajax 调用:

function ajax_search() {

    return $.ajax({

        beforeSend: function(event, ui) {
            $('#contents').html('<h2>' + title + ' <img src="imgs/loader.gif" alt="Loading..."></h2>');
        },

        type: 'POST',
        url: 'json/ricerca_bdt_ssp.php',
        dataType: 'json',
        data: {
            'user': account,
            'pass': password,
            'user_ad': account_ad,
            'pass_ad': password_ad,
            'device': deviceid,
            'host': dbhost,
            'port': dbport,
            'db': dbname,
            'foo': field_foo,
            'bar': field_bar,
            'baz': field_baz,
            ...
            'other_field': bdt_other_fields,
            'other_pattern': bdt_other_pattern
        }

    });

};

我的 DataTables 定义(加上一些其他关于工具提示和复选框排序的配置):

table = $("#mytable").DataTable({
    buttons: [ one,two,three ],
    aoColumnDefs: [
        { 'sWidth': '150px', 'aTargets': [1,2,7,8,12,13,15,16,18,19,20,21,22,23,24] },
        ....
    ],
    select: { style: 'multi', selector: 'td:first-child' },

    'autoWidth': false,

    iDisplayLength: 100,
    'scrollY': '50vh',
    'scrollX': 'true',
    'scrollCollapse': 'true'
});

我的DataTables定义不是更升级到服务器端分页,我会加上“bProcessing”:true和“serverSide”:true。

非常感谢您,
问候。

【问题讨论】:

  • 这里有什么问题?
  • 对不起,描述的情况我没有把问题说清楚。
  • 我想知道如何将您需要的参数传递给 DataTables 以进行服务器端分页。从查询中,查询需要一些其他参数,但我不知道如何查看并传递给 ajax 调用。

标签: php jquery sql-server datatables


【解决方案1】:

如果您想使用服务器端,您应该执行以下操作:

//...
serverSide: true,
ajax: {
    url: "json/ricerca_bdt_ssp.php",
    method: "POST",
    data: function (d) {
        d.user = account;
        d.pass = password;
        //...
        d.other_field = bdt_other_fields;
        d.other_pattern = bdt_other_pattern;
    }
//...

d 是一个包含所有分页所需的parameters 的对象,特别是startlength。如图所示,您可以展开d

那么您必须按照链接中指定的格式格式化返回的 json。

【讨论】:

  • 谢谢你,它有效,正是我所需要的。现在我只需要结束中间件资源。
猜你喜欢
  • 2023-03-17
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多