0

所以我不确定是否有更好的方法来做到这一点,但这是我目前的设置。

  1. 从我的数据库创建了一个代表我的表结构的 XSD 文件。
  2. 创建了一个类文件来保存我的函数,例如下面的函数。

代码示例:

Public Function GetUser(ByVal UserID As String) As xsdUser.UserDataTable

        Dim SqlConn As New SqlConnection(ConfigurationManager.ConnectionStrings("MyDatabase").ConnectionString)
        Dim SqlCom = New SqlCommand("User_Retrieve", SqlConn)
        Dim Adapter As SqlDataAdapter
        Dim UserDT As New xsdUser.UserDataTable

        Using SqlCom
            SqlCom.Parameters.Add(New SqlParameter("@I_UserID", SqlDbType.NVarChar, 4)).Value = UserID
            Adapter = New SqlDataAdapter(SqlCom)
            Adapter.Fill(UserDT)
        End Using

        If UserDT IsNot Nothing AndAlso UserDT.Rows.Count > 0 Then    
             'Return DataTable here or I guess DataRow since there should just be one.
        Else
             'Handle Error here if there is no row
        End If
End Function

现在对我来说,让两个文件做应该包含在一个文件中的事情似乎很奇怪。我觉得我应该有一个名为“User”的类文件,并在其中包含成员变量以及上面的类函数。但是我看到的所有教程都在使用这些数据表。最重要的是,我不确定如何处理函数末尾的 if 语句。我认为我不想返回整个 DataTable,因为我应该只有一行,而且如果我的函数应该返回数据表,我也不知道如何处理错误。我想我可以返回一个空的,然后如果我的代码中的表是空的,那么我会在那里处理它,但这似乎也很混乱。

那么任何人都可以清除其中的一些东西吗?这是从存储过程中检索信息的常用方法吗?或者是否有我在搜索结果中没有看到的更新的方法?

谢谢!

4

2 回答 2

1

返回 UserDataTable 是完全可以接受的。即使它只包含一行。唯一看起来不正常的是您检查此方法中的结果,该方法属于比用户界面更低的层。另请注意,您无需检查 UserDataTable 是否为空。

我认为这条线是必需的

 SqlCom.CommandType = CommandType.StoredProcedure
于 2012-06-03T15:52:55.600 回答
1

您最终会得到一大堆文件,并且可能功能分布在两个或多个程序集(类库)中,所以不用担心。您可以返回一个数据表,并抛出一个异常(在代码示例中的 ELSE 开关中),表明某种错误。

您可以返回一个数据表,但问题是“什么是最有用的接口”?考虑到使用此方法的任何东西都必须知道如何将该数据表翻译/解析为概念上的“用户”(检查表中是否只有一行,从用户名列中获取用户名等)。

数据表是所谓的“表模块”模式的实现。当您的应用程序建模非常简单的业务逻辑并且将数据库实体映射到面向对象实体的麻烦不值得时,这很有用。在 .net 工作的最初几年,我大量使用数据表,但是(除了我只需要显示数据网格的场景)对它们可能是非面向对象的程度感到沮丧:本质上,你被迫始终处理数据库行,而不是“用户”或“汽车”或“购物车”或映射到您正在建模的真实世界场景的其他实体。一旦应用程序变得有点复杂,所有这些数据表、数据行视图、表格适配器等都会变得非常混乱(至少根据我的经验)。

所以简而言之,我将创建一个“用户”类,将函数的返回类型更改为“用户”,并处理在您的方法中检索“用户”实例所需的所有数据库/验证逻辑。您可以继续使用您已经创建的数据集来提取“用户”相关数据,然后验证返回的内容并从中创建一个“用户”实例。您所指的“更新的方法”是对象关系映射器,如实体框架或 NHibernate。

于 2012-06-03T20:52:44.833 回答