0

我正在使用 $.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 表对象来创建表。

4

2 回答 2

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 行?!

于 2013-10-21T09:11:06.263 回答
0

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

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

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

我还在服务器端使用 parse_str 来处理分页请求,所以请求基本上是由于默认为 1000 的“max_input_vars”而失败

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

我将进行另一项工作,以便每批最多处理 1000 条记录或处理。

希望它可以节省其他一天

于 2015-12-02T00:22:15.367 回答