因界面中需要读取数据库中表的内容,将服务契约的返回值类型设置为SqlDataReader,以便供GridView调用。如下面的代码所示:
[ServiceContract]
public interface IStudent
{
[OperationContract]
SqlDataReader getAllStudent(string strsql,string tablename);
}
编译时错误提示SqlDataReader无法序列化。在网络上找到的解释(http://bbs.csdn.net/topics/80509708)是:
在 ADO.NET 的三个基本数据对象 — DataReader、DataTable 和 DataSet 中,只有 DataSet 可以与 Web 服务之间传递。这是因为,为了与 Web 服务进行通信,对象必须是可序列化的。(序列化是一个过程,它用于将对象的公共属性转换为 XML,并且因为 XML 只是纯文本,所以可以将其从一个应用程序传输到另一个应用程序,并且可以穿越防火墙,从而克服了 COM 的主要障碍之一。)DataReader 无法序列化,因为它们需要到服务器的开放连接。并且,因为 DataSet 处理 DataTable 的序列化以便进行封送处理,所以您也无法传递单个 DataTable。
将SqlDataReader换成DataSet,问题解决,如下面的代码所示:
[ServiceContract]
public interface IStudent
{
[OperationContract]
DataSet getAllStudent(string strsql,string tablename);
}