如何从 .Net Web Service 返回一个 DataTable?

3

我已经能够从设置为 .Net 2.0 的 Web 服务中返回 HashTable,但是该服务无法以 JSON 形式返回 DataTable。我一直收到以下错误信息:“在序列化对象时检测到循环引用”。有什么提示吗?

 [WebMethod(EnableSession = true) ]
public DataTable getSavedAddresses()
{
    DataTable dt = new DataTable();
    if (Session["ClientID"] != null)
    {
        int clientId = Convert.ToInt32(Session["ClientID"]);
        dt = Address.GetClientShippingAddresses(clientId);
    }
    return dt;

}

2个回答

1

循环引用可能是由于 DataTable 具有 Columns 属性,每个 DataColumn 对象都有一个 Table 属性。

Rick Strahl 的这篇博客文章 中的信息可能对您有所帮助。


我想我会尝试使用XML。 - GreenEggs
我认为这个答案在暗示需要一个自定义序列化器。这就是Rick Strahl在博客文章中所做的,首先使用JSON.NET,然后使用内置的JavaScriptSerializer库。 - Spivonious

0

只是快速回顾一下这个旧问题... 我是这样做的:

var header = datatable.Columns.Cast<DataColumn>().Select(r => new KeyValuePair<string, object>(r.ColumnName, r.DataType.Name));
var data = datatable.Select().AsEnumerable()
    .Select(r => r.Table.Columns.Cast<DataColumn>()
        .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal] is DBNull ? null : r[c.Ordinal] )
    ).ToDictionary(z=>z.Key,z=>z.Value)
);

return new DatatableRequestResponse
{
    data = data,
    header = header
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接