2

我是 Datatables 服务器端处理的新手,我没有找到适合使用 wcf 服务进行服务器端处理的示例或示例代码。

我正在尝试使用连接到 WCF 服务的 jQuery Datatables (datatables.net) 服务器端处理来获取数据。

我已经使用 iDisplayStart 和 iDisplayLength 实现了分页(我将其作为 wcf 方法的参数)来构造 sql 查询(在 wcf 方法中)以限制不显示的记录。

现在,问题是如何在 wcf 方法中实现搜索和排序。为此,我需要单击哪一列进行排序以及显示哪些列来构造 sql WHERE 子句。

在这里,我的做法是在前端根据数据表构造sql查询。它是使用 wcf 完成数据表服务器端处理的方法吗?

如果问题的任何部分不清楚,请发表评论。

以下是前端代码

剧本

    $(document).ready(function () {
        $('#example').dataTable({
            "aoColumns": [
                { "sTitle": "#",            "sName": "ID",      "mData": "ID"},
                { "sTitle": "PIN Number",   "sName": "PIN",     "mData": "PIN" },
                { "sTitle": "Amount (Rs.)", "sName": "Amount",  "mData": "Amount" }
            ],
            "sPaginationType": "full_numbers",
            "bJQueryUI": true,
            "bSort": true,
            "bProcessing": true,
            "bServerSide": true,
            "bAutoWidth": true,
            "sAjaxSource": "http://localhost:61216/datatabletestservice.svc/gettable",
            "fnServerData": function (sSource, aoData, fnCallback) {
                $.ajax({
                    "datatType": 'json',
                    "contentType": 'application/json',
                    "url": sSource,
                    "data": aoData,
                    "success": function (msg) {
                        var json = $.parseJSON(msg);
                        fnCallback(json);
                    }
                })
            },
        });
    });
</script>

身体

<body>
<form id="form1" runat="server">
    <div>
        <table id="example" width="100%">
            <thead>
            </thead>
            <tbody>
            </tbody>
        </table>
    </div>
</form>
</body>

WCF 方法(后端)

public string GetTable(int iDisplayStart, int iDisplayLength, string sSearch, bool bEscapeRegex, int iColumns, int iSortingCols, int iSortCol_0, string sSortDir_0, int sEcho)
    {
        string query;
        DataTable dt;

        DateTime t1 = DateTime.Now;
        string connectionstring = "server=my_server;database=my_db;uid=myuser;password=mypassword;";

        query = "SELECT SQL_CALC_FOUND_ROWS * FROM voucher LIMIT " + iDisplayStart + ", " + iDisplayLength;
        dt = MySqlHelper.ExecuteDatatable(connectionstring, query);
        int totalRows = Convert.ToInt32(MySqlHelper.ExecuteScalar(connectionstring, "SELECT FOUND_ROWS()"));
        string jsonString = JsonUtils.GetPlainJsonDataByDataTable(dt);
        var result = JsonUtils.GetObjectFromJson<dynamic>(jsonString);

        string test =  "{" +
                    "\"sEcho\": \"" + sEcho + "\", " +
                    "\"iTotalRecords\": \"" + totalRows + "\", " +
                    "\"iTotalDisplayRecords\": \"" + totalRows + "\", " +
                    "\"aaData\": " + result +
                "}";

        return test;
    }
4

2 回答 2

2

当请求来自 DataTable 时,参数 iSortCol_0 包含正在排序的列的索引,参数 sSortDir_0 指定排序方向(升序、降序)。

如此处所述:http ://rantdriven.com/post/Using-Datatablesnet-JQuery-Plug-in-with-WCF-Services.aspx

编辑

您可以使用 iSortCol_0 整数并将其传递给 sql 查询 order by 子句。这称为Order by Ordinal,大多数数据库引擎都支持。如果 iSortCol_0 是从零开始的,那么您需要在传入之前将其加 1。

于 2013-09-26T08:44:58.707 回答
0
$('#example').dataTable({            
        "bSort": true,
        "bProcessing": true,
        "bServerSide": true,
        "bAutoWidth": true,
        "lengthMenu": [[5, 10,-1], [5, 10, "All"]],
        "sAjaxSource": "http://------/Service1.svc/gettable",
        "fnServerData": function (sSource, aoData, fnCallback) {
            var tblid = { name: "tblId", value: "test" };//pass extra param
            aoData.push(tblid);
            $.ajax({
                "datatType": 'json',
                "contentType": 'application/json',
                "url": sSource,
                "data": aoData,
                "success": function (msg) {
                    var json = $.parseJSON(msg);
                    fnCallback(json);
                }
            })
        },
    });

WCF : 
[OperationContract]
  [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle =         WebMessageBodyStyle.WrappedRequest, Method = "GET")]
        string GetTable(int iDisplayStart,
            int iDisplayLength,
            string sSearch,
            bool bEscapeRegex,
            int iColumns,
            int iSortingCols,
            int iSortCol_0,
            string sSortDir_0,
            int sEcho,
            int webSiteId,
            int categoryId, string tblId);






public string GetTable(int iDisplayStart, int iDisplayLength, string sSearch, bool bEscapeRegex,
     int iColumns,int iSortingCols,int iSortCol_0,string sSortDir_0,int sEcho,int webSiteId,int categoryIdm,string tblId)
    {
        List<object[]> items = new List<object[]>();
        using (SqlConnection con = new SqlConnection(@"connection"))
        {
            using (SqlCommand cmd = new SqlCommand("DT_TEST", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@iDisplayStart", SqlDbType.Int).Value = iDisplayStart;
                cmd.Parameters.Add("@iDisplayLength", SqlDbType.Int).Value = iDisplayLength;
                cmd.Parameters.Add("@sSearch", SqlDbType.VarChar).Value = sSearch;
                cmd.Parameters.Add("@bEscapeRegex", SqlDbType.Bit).Value = bEscapeRegex;
                cmd.Parameters.Add("@iColumns", SqlDbType.Int).Value = iColumns;
                cmd.Parameters.Add("@iSortingCols", SqlDbType.Int).Value = iSortingCols;
                cmd.Parameters.Add("@iSortCol_0", SqlDbType.Int).Value = iSortCol_0;
                cmd.Parameters.Add("@sSortDir_0", SqlDbType.VarChar).Value = sSortDir_0;
                cmd.Parameters.Add("@sEcho", SqlDbType.Int).Value = sEcho;
                cmd.Parameters.Add("@webSiteId", SqlDbType.Int).Value = webSiteId;
                cmd.Parameters.Add("@categoryIdm", SqlDbType.Int).Value = categoryIdm;
                cmd.Parameters.Add("@tblId", SqlDbType.VarChar).Value = tblId;
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    List<object> rowitem = new List<object>();
                    rowitem.Add(rdr.GetString(1));
                    rowitem.Add(rdr.GetString(2));
                    rowitem.Add(rdr.GetSqlDateTime(3).ToString());
                    items.Add(rowitem.ToArray());
                }
            }
        }

        JavaScriptSerializer serialiser = new JavaScriptSerializer();
        var result = items.ToArray();
        return serialiser.Serialize(new
        {
            sEcho,
            iTotalRecords = counr,
            iTotalDisplayRecords = count,
            aaData = result
        });
    }

参考另一种方式

于 2016-07-04T09:50:03.220 回答