2016-10-18 90 views
0

我的應用程序分爲兩部分:客戶端和服務器。 服務器端請求一個sql數據庫並將結果存儲在一個DataTable中。 然後,我使用下一個函數將DataTable轉換爲Json以將其發送給客戶端。空數據表到列名稱的Json

問題是當沒有結果時,我得到一個空字符串。 我想獲得一個字符串,這將允許客戶端顯示一個空的數據表但列名,我的意思是列標題!

這裏是在服務器端的功能,數據錶轉換成JSON:

public string ConvertDataTabletoString(DataTable dt) 
     { 
      System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      serializer.MaxJsonLength = Int32.MaxValue; 
      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); 
     } 

這裏是在客戶端的功能轉換JSON來的數據表背:

return (DataTable)JsonConvert.DeserializeObject(clientSoap.dataCommand(command), (typeof(DataTable))); 

謝謝提前!

+0

嘗試NewtonSoft DLL。字符串jsonString = string.Empty; jsonString = JsonConvert.SerializeObject(table); –

+0

我去@viveknuna。試試newtonsoft。它通過NuGet可用。你可以停止使用醜陋的DataTables,並使整個東西與奇妙的對象和列表 :) Newtonsoft軟件包與它很好地工作。 – Sebi

+0

@Sebi,我在一個小時前添加它,但我並不真正瞭解如何使用它。我從數據庫中獲取數據庫的結果然後呢? – Eytan

回答

0

在「no data rows」場景中,您的代碼正在序列化一個空字典。如果你想有你的列的列表,你可以添加一段代碼如下,以確保你的行字典不是空的。

... 
    rows.Add(row); 
} 
if (rows.Count == 0) 
{ 
    var row = new Dictionary<string, object>(); 
    foreach (DataColumn col in dt.Columns) 
     row.Add(col.ColumnName, ""); 
    rows.Add(row); 
} 
return serializer.Serialize(rows);  

如果客戶端將數據發送回你需要做的事情,以確保服務器不會嘗試將空行作爲存儲數據的服務器。

+0

感謝您的迴應。 row.Add(col.ColumnName,「」); – Eytan

+0

感謝您對row.Add(col.ColumnName,「」)的回覆。 你的意思是'行'?它不工作! – Eytan

+0

我的意思是行,但我也錯過了,你正在爲你的數據存儲一個名稱值對的列表。我更新了我的代碼示例。 – Richard

0

我使用了@Richard的響應,我創建了一個函數來檢查我們是否返回了一個空數據表來刪除創建的新空行。這不是100%好,但它的工作很好。

在服務器端:

public string ConvertDataTabletoString(DataTable dt) 
     { 
      System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      serializer.MaxJsonLength = Int32.MaxValue; 
      List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
      Dictionary<string, object> row; 
      if (dt.Rows.Count == 0) 
      { 
       row = new Dictionary<string, object>(); 
       foreach (DataColumn col in dt.Columns) 
        row.Add(col.ColumnName, ""); 
       rows.Add(row); 
       return "empty" + serializer.Serialize(rows); 
      } 

      else 
      { 
       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); 
      } 
     } 

在客戶端:

DataTable JsonToDataTable (string text) 
     { 
      if(text.Substring(0,5) == "empty") 
      { 
       text = text.Remove(0, 5); 
       DataTable dt = (DataTable)JsonConvert.DeserializeObject(text, (typeof(DataTable))); 
       dt.Rows[0].Delete(); 
       return dt; 
      } 
      return (DataTable)JsonConvert.DeserializeObject(text, (typeof(DataTable))); 
     }