Vb.net 在WCF和.NET中返回数据表

Vb.net 在WCF和.NET中返回数据表,vb.net,wcf,datatable,Vb.net,Wcf,Datatable,谢谢,威廉,这是票。必须在两端[DataTable.TableName]分配name属性 这里有一个旁注:似乎有一些学派(无意冒犯Marc)认为以下陈述总是正确的: “世界上的一切都可以而且应该被制成一个物体。” 简单地说,这并不总是正确的。在某些情况下,无论您如何定制,都无法将“对象”塞进任何cookiecuter或类中。要将这只野兽对象化,我必须创建大约4000个对象。我没有时间这么做,但这个项目必须作为服务运行。坦率地说,我认为米奇软件公司的开发人员需要更多地进入现实世界,并亲眼看到,尽管

谢谢,威廉,这是票。必须在两端[DataTable.TableName]分配name属性

这里有一个旁注:似乎有一些学派(无意冒犯Marc)认为以下陈述总是正确的:

“世界上的一切都可以而且应该被制成一个物体。”

简单地说,这并不总是正确的。在某些情况下,无论您如何定制,都无法将“对象”塞进任何cookiecuter或类中。要将这只野兽对象化,我必须创建大约4000个对象。我没有时间这么做,但这个项目必须作为服务运行。坦率地说,我认为米奇软件公司的开发人员需要更多地进入现实世界,并亲眼看到,尽管理论很棒,但它并不代表现实生活中的挑战。我完全支持为明显的好处而使用对象,但现实是,通用性并不存在。在我的行业中,即使是“大部分时间”也很少发生

在推出一套新技术并停止支持旧技术之前,他们需要确保新技术具有与旧技术相同的功能

记录在案:那些相信上述陈述是真实的人,也是那些拒绝接受我目前正在进行的项目的人

同样——感谢你们两位的时间、努力和意见

我正在尝试创建一个WCF函数,该函数将向我的控制台测试应用程序返回一个表。我是个彻头彻尾的傻瓜。数据是二维的,如下所示:

23 Letter
42 Another Letter
43 Document
...
以下是我想做的:

<ServiceContract()> _
Public Interface ILetterWriter
    <OperationContract()> _
    Function GetLetter(ByVal LetterID As String, ByVal StateID As String, ByVal CompID As String, ByVal tblVar As DataTable) As String

    <OperationContract()> _
    Function GetLetterNames(ByVal DepartmentType As Integer) As DataTable

End Interface



    Public Function GetLetterNames(ByVal DepartmentType As Integer) As DataTable Implements ILetterWriter.GetLetterNames
        Dim SQLCon As New SqlClient.SqlConnection
        Dim SQLCmd As New SqlClient.SqlCommand

        'Connect to the database
        SQLCon.ConnectionString = "Data Source=VMSQL08-SRV1;Initial Catalog=DotNetDev;User ID=aiis_pgmr;Password=ag58102;"
        SQLCon.Open()


        'Grab the stored procedure, which returns the letter names
        SQLCmd.CommandText = "sp_GetLetters"
        SQLCmd.CommandType = CommandType.StoredProcedure
        SQLCmd.Connection = SQLCon


        'Pass the parameters
        SQLCmd.Parameters.AddWithValue("@LetterType", DepartmentType)


        'Execute the stored procedure, fill the datatable from a data adapter
        GetLetterNames = New DataTable
        GetLetterNames.Load(SQLCmd.ExecuteReader)


        'Shut it down
        SQLCmd.Dispose()
        SQLCon.Close()
        SQLCon.Dispose()
    End Function
_
公共接口ILetterWriter
_
函数GetLetter(ByVal-LetterID作为字符串,ByVal-StateID作为字符串,ByVal-CompID作为字符串,ByVal-tblVar作为数据表)作为字符串
_
函数GetLetterNames(ByVal DepartmentType为整数)作为DataTable
端接口
DataTable实现ILetterWriter.GetLetterNames时的公共函数GetLetterNames(ByVal DepartmentType为整数)
Dim SQLCon作为新的SqlClient.SqlConnection
Dim SQLCmd作为新的SqlClient.SqlCommand
'连接到数据库
SQLCon.ConnectionString=“数据源=VMSQL08-SRV1;初始目录=DotNetDev;用户ID=aiis\u pgmr;密码=ag58102;”
SQLCon.Open()
'获取存储过程,它返回字母名称
SQLCmd.CommandText=“sp_getletletters”
SQLCmd.CommandType=CommandType.StoredProcess
SQLCmd.Connection=SQLCon
'传递参数
SQLCmd.Parameters.AddWithValue(“@LetterType”,DepartmentType)
'执行存储过程,从数据适配器填充数据表
GetLetterNames=新数据表
GetLetterNames.Load(SQLCmd.ExecuteReader)
“关掉它
SQLCmd.Dispose()
SQLCon.Close()
SQLCon.Dispose()
端函数
…当然,这是行不通的。我只需要让WCF将一个基本表传递给我的控制台应用程序。执行SQL似乎工作得很好,我就是无法将数据返回到我的应用程序

任何帮助都将不胜感激

谢谢,
杰森

我同意另一张海报


但是,如果要返回DataTable,如果要从WCF服务返回DataTable,则必须设置DataTable的“Name”属性。

一个词:不要——或者更准确地说:不要想它。。。。使用WCF,您应该拥有真实的域对象(例如,
Customer
Letter
等),并返回单个实例或这些实例的列表。远离
DataTable
技术——那已经是20世纪了……使用SQL Server,远离DataTable是一个好主意。因此,实体框架等。。。但是,我在Oracle商店,使用Oracle 9i,我甚至不能使用Oracle的beta EF,因为不支持存储过程(甚至不允许在EF向导设置中选择它们)。因此,必须使用带有数据集、DataTables和DataReader的直接ADO.NET。对于MVC框架来说,转换并不理想,但这是必须的。我知道你们都在说什么,但不幸的是,这一框架的业务规则很古怪。每个字母都有不同的属性集和属性数。我无法创建标准字母对象。在OperationContract中返回数据表之前,必须先设置数据表名称。DataTable测试=新DataTable();test.TableName=“无论如何”;