使用列名将DataTable清空到Json

时间:2016-10-18 14:08:18

标签: c# json datatable server json.net

我的应用程序分为两部分:客户端和服务器。 服务器端询问sql数据库并将结果存储在DataTable中。 然后我使用下一个函数将DataTable转换为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转换为DataTable的函数:

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

提前致谢!!

2 个答案:

答案 0 :(得分:0)

在&#34;没有数据行&#34;方案,您的代码正在序列化一个空字典。如果您想要列出列表,可以添加一段代码,如下所示,以确保您的行字典不是空的。

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

如果客户端将数据发送回服务器,您需要做一些事情以确保服务器不会尝试将空行存储为数据。

答案 1 :(得分: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)));
        }