【问题标题】:Returning DataTables and DataSets from WCF web services从 WCF Web 服务返回 DataTables 和 DataSets
【发布时间】:2014-06-16 15:57:07
【问题描述】:

我正在寻找有关 WCF Web 服务中 DataTables 和 DataSets 行为的说明。

对于 ASMX Web 服务,DataTable 对象不可序列化,因此不可在 Web 方法中返回。我总是用 ASMX 返回数据集。

我正在转向 WCF 服务,我想确认返回 DataTables 和 DataSets 的这种行为与这项技术相同。我的测试表明是这样,但我想确认这实际上是行为,或者是否有一些我没有做的事情才能成功返回 DataTable。

此外,在返回用户定义类型的对象时,我无法成功地将 DataTable 或 DataSet 作为用户定义类的公共属性返回。

例如,对于下面的测试类,从 WCF 服务返回 CTestClass 类型的对象会返回属性 DOB、Name 和 YearsOfAge,但无法返回 MyDataSet。 DataSet 在构造函数中创建。当我将 GetDataSet 函数作为公共函数调用时,我的 WCF Web 服务成功地将 DataSet 返回给客户端应用程序。

Public Class CTestClass

Public Sub New()
    m_myDataSet = Me.GetDataSet
End Sub

Private m_DOB As Date 
Public Property DOB() As Date
    Get
        Return m_DOB
    End Get
    Set(ByVal value As Date)
        m_DOB = value
    End Set
End Property

Private m_sName As String 
Public Property Name() As String
    Get
        Return m_sName
    End Get
    Set(ByVal value As String)
        m_sName = value
    End Set
End Property

Private m_iYearsOfAge As Integer
Public Property YearsOfAge() As Integer
    Get
        Return m_iYearsOfAge
    End Get
    Set(ByVal value As Integer)
        m_iYearsOfAge= value
    End Set
End Property

Private m_myDataSet As DataSet

Public ReadOnly Property MyDataSet() As DataSet
    Get
        Return m_myDataSet
    End Get
End Property

Private Function GetDataSet() As DataSet
    Dim ds As New DataSet
    Dim dt As New DataTable

    ' Create new DataTable instance.
    Dim table As New DataTable
    ' Create four typed columns in the DataTable.
    table.Columns.Add("Dosage", GetType(Integer))
    table.Columns.Add("Drug", GetType(String))
    table.Columns.Add("Patient", GetType(String))
    table.Columns.Add("Date", GetType(DateTime))
    ' Add five rows with those columns filled in the DataTable.
    table.Rows.Add(25, "Indocin", "David", DateTime.Now)
    table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now)
    table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now)
    table.Rows.Add(21, "Combivent", "Janet", DateTime.Now)
    table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now)
    table.Rows.Add(500, "Paracetamol", "Simone", DateTime.Now)

    ds.Tables.Add(dt)

    Return ds
End Function

End Class

【问题讨论】:

  • 您需要为序列化程序提供一个设置器才能工作。 stackoverflow.com/questions/1702802/…
  • 所以我的测试类没有返回 DataSet 的问题与属性是只读的有关吗?
  • 有什么方法可以让我的服务从公共函数返回 DataTable?
  • 是的,只读是行不通的,如果你用谷歌搜索“wcf serialize datatable”,你会发现它很重要,为什么不返回数据集或者更好的 DTO。

标签: vb.net web-services wcf datatable dataset


【解决方案1】:

好的。删除只读属性允许在我的自定义对象中返回 DataSet。

在将字符串值显式分配给 DataTable 的 TableName 属性后,我能够从公共方法和自定义对象中返回 DataTable 作为返回对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多