2014-02-24 24 views
1

我有一个数据访问层类有一个方法(GetPeople),将从SQL Server表(人)检索记录。此表有20多个字段,其中包括varbinary类型。vb.net DAL指定列返回

眼下,SQL查询是一样的东西

SELECT * FROM people 

从我BLL类,我会打电话给DAL.GetPeople(),这将返回所有列。

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

UPDATE 为了更好地解释它: 在DAL我有一个方法GetPeople()它调用一个SQL Server功能GetPeople。 在BLL中,我有一个方法GetPeople(),它在完成一些业务逻辑之后调用DAL.GetPeople()。 在我的表示层中,我称之为BLL.GetPeople()。

这是工作,但在SQL函数,我有“选择*从人”。有时我想从表中检索一列(例如名称),但在这种情况下,所有列都会返回,我认为这会影响性能。

所以,我想有一种对这个SQL Server的功能,它的列返回将取决于我如何调用该函数动态SELECT查询的...

+1

我认为这取决于你如何编写你的DAL。 ADO,EF,Simple.Data?就目前而言,这可能太开放了一个问题? –

+0

重要的是你的GetPeople方法返回什么类型 - 类,数据集,其他?另外,不要使用从*任何选择*。明确指定列。 –

+0

数据集...是这个方法返回的结果。当然,我不想使用“*”,这就是为什么我要指定列... – escar

回答

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(“列1,列2, column3“)

列名称包装在[]符号中,因此您不必担心导致数据库出错的保留字。

+0

这是我首先想到的,但SQL查询在数据库(函数)上,所以我可以考虑的唯一方法是将字符串传递给此函数,并在该函数上动态构建查询,然后使用sp_executesql执行命令... – escar

+0

是的,据我所知,在这种情况下,在数据库中有一点功能是没有意义的,因为它会动态生成,因此在静态函数方面不是最优的。我个人会在应用程序中生成字符串,但那只是我:) –

0

您的SQL查询更改为类似

SELECT column1, column2, column3 FROM people; 

编辑:

你打算什么需要做的是建立功能将使您的SQL字符串一起给你。当我做到这一点之前,我有一个检查列表控件中的所有可用字段,如果我想要它们被拉出,我检查了它们。被检查的项目然后通过函数来​​组装字符串。它应该非常简单,因为没有任何联接正在进行。

+0

对不起,也许我没有解释正确。有时我想“选择column1,column2,column3 FROM people”,其他时间“SELECT column1 FROM people;”和其他时间“选择*从人;”。我只是在寻找一种方法来控制我将返回哪些领域。 – escar