2016-10-18 13 views
0

私のアプリはクライアントとサーバーの2つに分かれています。 サーバー側はSQLデータベースに質問し、結果をDataTableに格納します。 次に、次の関数を使用して、DataTableをJsonに変換してクライアントに送信します。空のDataTableからJsonへ列名

問題が発生した場合は、空の文字列が表示されます。 クライアント側が空のデータテーブルを表示できるようにする文字列を取得したいと思いますが、列名を使用すると、列ヘッダーが表示されます。ここで

は、JSONへのDataTableに変換するサーバ側の関数である。

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

そしてここでは、背中のDataTableにJSONを変換するために、クライアント側の機能である:中

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

感謝前進 !!

+0

はNewtonSoft DLLをしてみてください。 string jsonString = string.Empty; jsonString = JsonConvert.SerializeObject(table); –

+0

私は@viveknunaと一緒に行く。 newtonsoftを試してみてください。それはNuGetを介してavaiableです。あなたは醜いDataTablesの使用をやめて、すばらしいオブジェクトとList:)を使ってすべてのものを作ることができます:) Newtonsoftパッケージはうまく動作します。 – Sebi

+0

@セビー、私はそれを1時間前に追加するが、私はそれを使用する方法を本当に理解していない。私はデータテーブル内のデータベースから結果を得て、それから? – Eytan

答えて

0

"データ行なし"シナリオでは、コードが空の辞書をシリアル化しています。列のリストを表示するには、次のようなコードスニペットを追加して、行辞書が空でないことを確認します。

... 
    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))); 
     } 
関連する問題