2014-09-10 56 views
0

我有一個簡單的功能,使用串行如下從C#回到我的數據表作爲JSON -非常大的JSON(92000行)不加載

public static string ConvertToJSON (DataTable dt) 
{ 
System.Web.Script.Serialization.JavaScriptSerializer serializer = new      System.Web.Script.Serialization.JavaScriptSerializer(); 
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
Dictionary<string, object> row; 
foreach (DataRow dr in dt.Rows) 
{ 
row = new Dictionary<string, object>(); 
foreach (DataColumn col in dt.Columns) 
{ 
row.Add(col.ColumnName, dr[col]); 
} 
rows.Add(row); 
} 
return serializer.Serialize(rows); 
} 

我用如下

return ConvertToJSON(objDataTable); 

其中objDataTable是我的DataTable

我也有

return JsonConvert.SerializeObject(strArrMapObject, Formatting.None); 

,我現在用的庫Newtonsoft.Json和strArrMapObject是objDataTable

建立了一個Itemarray

上述兩種方法的工作適合於小數據表,我得到的輸出這樣的 -

["11-06-2014 00:00:00","17:45:00","Beta","357637031475680","404490480844084","78","IN","","8143888569","48"] 

但是,當我做一個大的數據表(例如。 92,000行),沒有任何反應!

沒有響應,也沒有超時錯誤。

所以,當我使用

alert (response); 

[在Javascript或甚

document.getElementById('divDataHolder').innerHTML = response; 

[在Javascript]

絕對沒有任何反應!

請幫忙!

+1

爲什麼地球上你想你的連載整個數據庫到JSON ......就是爲什麼? :-S這樣做從來沒有好的理由。您可能想要分頁數據或更具體,不要將數據庫轉儲到客戶端! – Belogix 2014-09-10 13:29:08

+0

嗨Belogix 謝謝你的迴應。我同意這個想法在我腦海中浮現,我可能需要重新審視我的方法。基本上我的解決方案中有一個日期過濾器。所以客戶可以選擇日期範圍來檢索數據。理想情況下,他應該能夠選擇任何日期範圍。但是,你是否建議我限制日期範圍? (根據我的申請,每天的平均行數可能在500左右) – itzprobablyme 2014-09-10 13:33:52

+0

我的建議是,您限制任何一次向客戶展示的數量。因此,儘管您可能會得到500條與您的過濾器相匹配的記錄,但您一次只能返回50條記錄。然後用戶可以點擊NEXT PAGE箭頭並顯示下一個50,依此類推。 @ Margus正在說同樣的事情......這是處理大量數據的常見方法/模式。谷歌的結果就是一個很好的例子。無論如何,人類無法應對92K +記錄! :-) – Belogix 2014-09-10 13:37:30

回答

2

重寫你的要求,這樣你可以問

select 100 rows page 1 // selects items 1-100 
select 100 rows page 2 // selects items 101-200 

這將解決更多然後1點的問題。

public static string ConvertToJSON (DataTable dt, int page = 0, int count = 100)  
//... 
foreach (DataRow o in dt.AsEnumerable().Skip(page * count).Take(count)) 

編輯:您可以使用下面的方法來獲得的Json

//add reference System.Data 
//add reference System.Web.extensions 
//add reference System.Web.DataTableExtensions 
public static string ConvertToJson(DataTable dt, int page = 0, int count = 100) 
{ 
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
    var rows = new List<Dictionary<string, object>>(); 
    foreach (DataRow dr in dt.AsEnumerable().Skip(page * count).Take(count).ToList()) 
    { 
     rows.Add(dt.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => dr[col])); 
    } 
    return serializer.Serialize(rows); 
} 
+0

嗨瑪格斯,感謝您的迴應。因爲,我將使用這些數據來對某個人的運動歷史進行地理映射;所以這樣的分頁可能不起作用。客戶端是否有任何臨時數據存儲方法(如ASP.NET中的Datarepeater)或者是否存在可以緩慢構建的jQuery網格,然後使用網格中的特定行進行地理映射? – itzprobablyme 2014-09-10 13:38:13

+0

好的方法是jqGrid(http://www.trirand.com/blog/?page_id=5) – Margus 2014-09-10 13:41:17

+0

謝謝Belogix和Margus!我在多年後開始編碼:)我想我必須坐下來重新思考我對解決方案的看法。感謝您的展示! (期待更多的代表儘快投票答覆你的答案) – itzprobablyme 2014-09-10 13:45:59