【问题标题】:vb.net DAL Specify columns returnedvb.net DAL 指定返回的列
【发布时间】:2014-03-26 08:21:13
【问题描述】:

我有一个数据访问层类,它有一个方法 (GetPeople),可以从 SQL Server 表 (people) 中检索记录。该表有20多个字段,包括varbinary类型。

现在,SQL 查询类似于

SELECT * FROM people

在我的 BLL 类中,我将调用 DAL.GetPeople(),它将返回所有列。

指定要返回哪些列以提高性能的最佳方法是什么?例如,有时我想返回所有字段,有时只返回一两个。

更新 为了更好地解释它: 在 DAL 中,我有一个调用 SQL Server 函数 GetPeople 的方法 GetPeople()。 在 BLL 中,我有一个方法 GetPeople(),它在执行一些业务逻辑后调用 DAL.GetPeople()。 在我的表示层中,我调用了 BLL.GetPeople()。

这是可行的,但在 SQL 函数上,我有“SELECT * FROM people”。有时我只想从表中检索一列(例如名称),但在这种情况下,所有列都会返回,我认为这会影响性能。

所以,我想对此 SQL Server 函数进行一种动态 SELECT 查询,其返回的列将取决于我如何调用该函数...

【问题讨论】:

  • 我认为这取决于您如何编写 DAL。 ADO、EF、Simple.Data?就目前而言,这可能是一个过于开放的问题?
  • 重要的是您的 GetPeople 方法返回什么类型 - 类、数据集还是其他?另外,不要使用 Select * from ANYTHING。明确指定列。
  • 一个数据集...是此方法将返回的内容。当然,我不想用“*”,所以我要指定列……

标签: vb.net data-access-layer 3-tier


【解决方案1】:

我认为您正在寻找这样的东西,您可以在其中传递以逗号分隔的列名列表

Private Function GenerateQuery(ByVal columnNames As String) As String

    '   columnNames in the following format 'column1,column2,column3'
    Dim lstColumnNames As String() = Split(columnNames, ",")
    Dim strSQL As New StringBuilder
    strSQL.Append("SELECT ")
    For intColNumber As Integer = 0 To lstColumnNames.GetUpperBound(0)
        strSQL.Append("[")
        strSQL.Append(lstColumnNames(intColNumber))
        strSQL.Append("]")
        If intColNumber < lstColumnNames.GetUpperBound(0) Then
            strSQL.Append(", ")
        End If
    Next
    strSQL.Append(" FROM People ")
    Return strSQL.ToString

End Function

你可以这样使用它:SqlCommand.CommandText = GenerateQuery("column1,column2,column3")

列名用 [] 符号包裹,因此您不必担心保留字会导致数据库出错。

【讨论】:

  • 这是我首先想到的,但是 SQL 查询是在数据库(函数)上,所以我能想到的唯一方法是将字段字符串传递给这个函数并在该函数上动态构建查询, 然后使用 sp_executesql 执行命令...
  • 是的,据我所知,在这种情况下,数据库中的函数没有什么意义,因为它将动态生成,因此不像静态函数那样是最佳的。我个人会在应用程序中生成字符串,但这只是我 :)
【解决方案2】:

将您的 SQL 查询更改为类似

SELECT column1, column2, column3 FROM people;

编辑:

您需要做的是创建一个函数,该函数将为您将 SQL 字符串组合在一起。当我之前这样做时,我在一个检查列表控件中拥有所有可用字段,如果我想要它们被拉出,我检查它们。然后将检查的项目放入该函数以组装字符串。这应该很简单,因为没有任何连接正在进行。

【讨论】:

  • 对不起,可能我解释的不对。有时我想“SELECT column1, column2, column3 FROM people”,其他时候“SELECT column1 FROM people;”和其他时候“SELECT * FROM people;”。我只是在寻找一种方法来控制我将返回哪些字段。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2010-10-17
  • 2013-05-10
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2018-09-21
相关资源
最近更新 更多