使用WCF服务返回DataTable对象

Ale*_*dra 5 datatable wcf serialization dataset

这是一个奇怪的问题,我正在与WCF尝试在响应中发送DataTable.我有以下服务合同:

[ServiceContract]
public interface ISapphireDataService {
    [OperationContract]
    DataTable LoadData(string query, DateTime start, DateTime end);

    [OperationContract]
    string LoadDataTest();
}
Run Code Online (Sandbox Code Playgroud)

以及方法的以下实现(其中provider是一个使数据库调用并返回DataTable的类):

public DataTable LoadData(string query, DateTime start, DateTime end) {
    //DataSet temp = new DataSet();
    //temp.Tables.Add(provider.LoadData(query, start, end).Copy());
    //return temp;

    return provider.LoadData(query, start, end).Copy();
}

public string LoadDataTest() {
    return "Hello World!";
}
Run Code Online (Sandbox Code Playgroud)

现在,当我这样离开时,我总是在调用LoadData(...)方法时出错:

接收到http:// localhost:8731/Design_Time_Addresses/DataProviderServiceLibrary/SapphireDataService /的HTTP响应时发生错误 .这可能是由于服务端点绑定不使用HTTP协议.
这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭).
请参阅服务器日志以获取更多详

这很奇怪,因为服务配置为使用wsHttpBinding,我假设使用HTTP协议.如果我尝试调用LoadDataTest()方法,则不会发生错误!

所以我所做的就是将我从数据库中获取的这个表放入DataSet对象中并且它有效!没有错误或任何类似的东西.但是,DataSet中返回的表是EMPTY.所有字段都是空的,没有数据被正确转移/反序列化,似乎:(

这似乎是一个常见问题,但我还没有看到有效的答案.有任何想法吗?

Ott*_*ttO 17

我知道这是一个老问题,但也许有人仍然遇到同样的问题(就像我做的那样).我遇到了同样令人困惑的错误信息,花了好几个小时撞到我的头......

    public DataTable GetDataTable()
    {
        DataTable dt = new DataTable(**"MY_NAME"**);
        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("Caption", typeof(string));

        dt.Rows.Add(new object[] { 1, "hooray!" });
        return dt;
    }
Run Code Online (Sandbox Code Playgroud)

你应该给你的DataTable一个名字,我使用了重载的构造函数,没有更多的错误!

编辑:当然,你真的不应该使用DataTable或DataSet作为WCF服务的返回类型.对我而言,这仅仅是出于测试目的,因为我认为这是从数据库和线路中获取内容的最快捷方式....男孩我错了:)


Ral*_*ine 7

使用DataSet和DataTables不是最佳实践.它们非常笨重,最好使用一组数据类(poco/dto).

一些背景信息:

从WebServices返回数据集是撒旦的产生并代表世界上所有真正的邪恶

  • @rdkleine:你应该编辑你的答案,而不是评论它. (2认同)

Ale*_*dra 6

虽然我承认通过服务发送DataSet和DataTables是不好的,但实际上我已经改变了它,所以我没有这样做,问题的根源在其他地方撒谎.

对于那些绝对需要使用DataTables/DataSet的人来说,我得到的错误是因为我试图发送一个DbNull对象.我想这不是可序列化的,或者有其他原因拒绝发送它.

在手动"转换"DbNull为null之后(我必须这样做才能将数据提取到我自己的自定义DataContract中),错误消失了,它运行了!

  • 你救了我的头发 (2认同)