2014-02-24 28 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