使用$ .ajax从服务器加载1000+条记录时出错

时间:2013-10-21 09:03:25

标签: javascript jquery asp.net ajax json

我使用$ .ajax和asp.net中的json从数据库中获取记录。

一切正常但当记录数大于1000时,它会崩溃并显示“500(内部服务器错误)”错误消息。

jQuery代码

    $.ajax({ type: "post",
        url: "Default.aspx/SELECT_ALL",
        data: _data,
        contentType: "application/json;charset=utf-8", dataType: "json",
        success: function (data) {
            if (data.d != null || data.d != 'null') {
                var Items = data.d;

                if (Items.length > 0) {

                    // Create Table header and prepare the body
                    $.fn.create_table();

                    for (var r = 0; r < Items.length; r++) {

                        // Add new row and columns
                        var tRow = tBody.insertRow(-1);
                        for (var x = 0; x < Cols.length; x++) {
                            var td = tRow.insertCell(-1);
                            var input = document.createElement('input');
                            input.type = 'text';
                            input.id = columns[x] + '-' + row;

                            if (x == 1 || x == 2 || x == 3) {
                                input.setAttribute("class", "validate text");
                            } else if (x == 4) {
                                input.setAttribute("class", "validate number number-only");
                            }

                            if (x == 0) {
                                input.type = 'checkbox';
                                input.value = row;
                            } else {
                                switch (x) {
                                    case 1:
                                        //input.value = Items[r].BMLCode;
                                        td.innerHTML = '<input type="text" id="' + columns[x] + '-' + row + '" value="' + Items[r].Code + '" /><input type="hidden" name="ID" id="ID" value="' + Items[r].ID + '" /><input type="hidden" name="updated" id="updated" />';
                                        break;

                                    case 2:
                                        input.value = Items[r].Description;
                                        break;

                                    case 3:
                                        input.value = Items[r].Unit;
                                        break;

                                    case 4:
                                        input.value = Items[r].Price;
                                        input.setAttribute("onblur", '$.fn.adRow(' + r + ');');
                                        break;

                                    default:
                                        input.value = 'Error';
                                        break;
                                }
                            }

                            if (x == 0) {
                                td.innerHTML = '<input type="checkbox" id="' + columns[x] + '-' + row + '" value="' + row + '" /><label>' + row + '</label>';
                            } else if ($.inArray(x, [1, 3, 4, 5])) {
                                td.appendChild(input);
                            }

                            if (x >= columns.length - 1) {
                                row++;

                                $(".number-only").each(function () {
                                    $(this).numberBox();
                                });
                            }
                        }
                    }
                } else {
                    $.fn.create_table();
                }
            }
        }
    });

ASP.NET代码

#region Items
public class clsCodes
{
    public string ID { set; get; }
    public string Code { set; get; }
    public string Description { set; get; }
    public string Unit { set; get; }
    public string Rate { set; get; }
}
#endregion


#region Select All
[WebMethod]
public static clsCodes[] SELECT_ALL(string Activity_ID)
{
    try
    {
        List<clsCodes> _Return = new List<clsCodes>();
        Database db = new Database();
        DataTable table = null;

        Dictionary<string, object> Parameters = new Dictionary<string, object>();
        Parameters.Add("Procedure", "usp_codes");
        Parameters.Add("@Activity_ID", MajorActivity_ID);

        db.Open();
        table = db.ExecuteTable(Parameters);
        db.Close();

        if (table != null && table.Rows.Count > 0)
        {
            int iRow = 0;
            foreach (DataRow dRow in table.Rows)
            {
                if (iRow >= 1000)
                {
                    break;
                }
                clsCodes _Code = new clsCodes();
                _Code.ID = dRow["ID"].ToString();
                _Code.Code = dRow["Code"].ToString();
                _Code.Description = dRow["Description"].ToString();
                _Code.Unit = dRow["Unit"].ToString();
                _Code.Rate = dRow["Rate"].ToString();
                _Return.Add(_Code);

                iRow++;
            }
        }
        return _Return.ToArray();
    }
    catch (Exception ex)
    {
        return null;
    }
}
#endregion

注意:我在javascript中使用HTML DOM Table Object来创建表。

2 个答案:

答案 0 :(得分:1)

你在表中有多少行?

if (table != null && table.Rows.Count > 0) {
    int iRow = 0;
    foreach(DataRow dRow in table.Rows) {
        if (iRow >= 1000) {
            break;
        }
        clsCodes _Code = new clsCodes();
        _Code.ID = dRow["ID"].ToString();
        _Code.Code = dRow["Code"].ToString();
        _Code.Description = dRow["Description"].ToString();
        _Code.Unit = dRow["Unit"].ToString();
        _Code.Rate = dRow["Rate"].ToString();
        _Return.Add(_Code);

        iRow++;
    }
}
return _Return.ToArray();

由于“500服务器错误”,问题必须出在您的ASP.net代码中

中可能存在未知异常
catch (Exception ex) {
    return null;
}

它适用于999行?!

答案 1 :(得分:0)

虽然这个问题很老但我在页面上遇到了类似的问题,需要显示大量数据,我使用服务器端分页来获取用户滚动操作的数据。

无论我使用的批量大小,当记录数达到1000时,请求总是失败。

原因是我在返回的数据上创建了复选框,以选择单个记录以便执行进一步操作并使用ajax请求发布表单数据

我还在服务器端使用parse_str来处理分页请求,因此请求失败主要是由于&#34; max_input_vars&#34;默认为1000

解决方法是在php.ini文件中更改此设置,它应该可以正常工作,但并非所有托管服务提供商都允许更改此设置,或者至少我不知道是否这样做。

我还有另外一项工作,每批最多1000条记录或处理。

希望它能节省一些其他的一天