0

所以我正在开发一个客户端-服务器应用程序,它利用MySQL数据库并读取/写入它。在我将以下方法添加到interface我的WCF Service.

[OperationContract]
List<MySqlDataAdapter> ShowTables();

将此添加到服务合同时,scvutil.exe 将失败并声明服务器由于内部错误而无法处理请求。

现在我已经阅读了这个问题:通过 WCF 服务返回数据集时出现问题,我很好奇它与我的问题的关系有多密切。我知道返回 aDataSet不是要走的路线,但究竟是什么导致了这个错误,以及将这些信息返回给客户的明智选择是什么?

感谢您的时间、考虑和帮助。

4

3 回答 3

1

要回答您的问题,转换器很可能无法成功地将 MySqlDataAdapter 转换为正确的(非常迟钝的)XML 对象。即使你不想使用它,处理数据的性能影响也不会扩展(并且可能无法达到可接受的标准),不能被 .NET 以外的任何东西使用,并且会直接绑定您的 UI 层到数据库对象及其实现。WCF 并不是一个好的开始。

我不确定 ShowTables 中返回的数据类型,但最好的选择是创建一个实体,您可以将 MySqlDataAdapter 中的数据转换为可以正确序列化以供客户端使用的实体。

例如:

如果您有简单的表数据:

TableEntity : BaseEntity
{

    string TableName { get; set; }

    List<TableDataEntity> Data { get; set; }

    TableEntity(MySqlDataAdapter dataAdapter)
    {
        //convert dataAdapter into TableEntity properties
    }
}

BaseEntity 是可选的,只允许公共属性。您的操作将更改为:

[OperationContract]
List<TableEntity> ShowTables();

如果上述工作听起来比您需要的要多,我会确定您是否需要 WCF。

于 2013-05-20T15:36:16.103 回答
1

首先要回答您的问题,我会说它可能会产生错误,因为 MySqlDataAdapter 不可序列化和/或它包含在外部库中。关于关于 DataSet 的那个问题,可能同样适用,数据适配器更像是一些数据的包装器,而不是包含数据本身的对象 - 但是,我阅读了您发布的那个问题,他们似乎建议 WCF 仍然允许您返回一个数据集,这是非常糟糕的做法。

长期以来,最好的办法是按照杰的回答。您的 WCF 服务充当数据层和应用程序逻辑之间的中间人,因此让它负责读取 DataAdapter 并将输入转换为一组漂亮的超薄类 - 然后可以由 WCF 序列化并传递回到客户端。

于 2013-05-20T15:52:02.447 回答
0

您是否已将 DataContract 属性添加到MySqlDataAdapter并将 DataMember 属性添加到 MySqlDataAdapter 类中的每个属性,因为 WCF 适用于 DataContractSerialization 并且它需要一些额外的属性。

于 2013-05-23T14:17:59.523 回答