2014-02-24 5 views
1

SQL Server 테이블 (사람)에서 레코드를 검색하는 메서드 (GetPeople)가있는 데이터 액세스 계층 클래스가 있습니다. 이 테이블에는 varbinary 유형을 포함하여 20 개가 넘는 필드가 있습니다.vb.net DAL 반환 된 열 지정

는 지금, SQL 쿼리 내 BLL 클래스에서

SELECT * FROM people 

같은 것을, 나는 모든 열을 반환하는, DAL.GetPeople()를 호출합니다.

성능을 향상시킬 수 있도록 반환 할 열을 지정하는 가장 좋은 방법은 무엇입니까? 예를 들어, 때로는 모든 필드를 반환하고, 다른 경우에는 한두 개만 반환하려고합니다.

UPDATE 더 잘 설명하기 : DAL에서 내가는 SQL 서버 기능 GetPeople를 호출하는 방법 GetPeople()를 가지고있다. BLL에서 비즈니스 로직을 수행 한 후 DAL.GetPeople()을 호출하는 GetPeople() 메소드가 있습니다. 내 프레젠테이션 계층에서 BLL.GetPeople()을 호출합니다.

이 기능은 작동하지만 SQL 기능에서 "SELECT * FROM people"이 있습니다. 때로는 테이블에서 하나의 열 (예 : .name) 만 검색하려고하지만이 경우 모든 열이 반환되므로 성능에 영향을 미친다 고 생각합니다.

그래서, 난 ... 열이 나는 함수를 호출하는 방법에 따라 달라 반환이 SQL 서버 기능, 동적 SELECT 쿼리의 종류를 가지고 싶습니다

+1

당신의 DAL을 어떻게 작성 했느냐에 달려 있다고 생각합니다. ADO, EF, Simple.Data? 그것이 의미하는 바에는 너무 개방적이어서 질문을 끝낼 수 있습니까? –

+0

중요한 것은 GetPeople 메서드가 반환하는 형식입니다 - 클래스, 데이터 집합, 기타? 또한 Select *를 사용하지 마십시오. 명시 적으로 열을 지정하십시오. –

+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

죄송합니다. 때로는 "SELECT column1, column2, column3 FROM people", 다른 시간에는 "SELECT column1 FROM people;"하고 싶을 때가 있습니다. 그리고 다른 때는 "SELECT * FROM people;"입니다. 나는 어느 분야에서 내가 돌아갈 것인지를 통제하는 방법을 찾고 있었다. – escar