2013-05-20 39 views
0

因此,我正在開發一個客戶端 - 服務器應用程序,該應用程序利用MySQL數據庫並對其進行讀取/寫入。一切都運行良好,直到我將下面的方法添加到我的WCF Serviceinterface通過WCF服務返回MySqlDataAdapter列表導致錯誤

[OperationContract] 
List<MySqlDataAdapter> ShowTables(); 

當此添加到服務合同,scvutil.exe將失敗,狀態服務器由於內部錯誤無法處理該請求。

現在我讀過這個問題:Issue while returning Dataset through WCF Service我很好奇它與我的問題有多密切。我明白,返回DataSet不是要走的路線,但是究竟是什麼導致了這個錯誤,以及將這個信息返回給客戶端的一個可取的選擇是什麼?

謝謝你的時間,考慮和幫助。

回答

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。

1

首先回答你的問題我會說它可能會產生一個錯誤,因爲MySqlDataAdapter不可序列化和/或它包含在外部庫中。關於DataSet的這個問題可能同樣適用,數據適配器更像是包含數據本身的對象的包裝 - 然而,我讀過你發佈的問題,他們似乎暗示WCF仍然會允許你返回一個DataSet,這只是非常糟糕的做法。

長久以來最好的事情是沿着傑伊的答案。您的WCF服務充當您的數據層和應用程序邏輯之間的中間人,因此讓它負責讀取DataAdapter並將輸入轉換爲一組很好的細長類 - 然後可以通過WCF序列化並傳遞迴到客戶端。

0

具有u加DataContract屬性個MySqlDataAdapter和DataMember屬性類中的每MySqlDataAdapter的屬性,因爲WCF適用於DataContractSerialization,它需要一些額外的屬性。

相關問題