2009-06-02 6 views
1

I 데이터 액세스를 위해 공공 모듈을 가지고 몇 가지 코드 상속했습니다vb.net 데이터 액세스 용 모듈 - 얼마나 나쁜가?

코드는 다음과 같습니다

Public Module Foo 
    Dim ds As New DataSet 

    Public Function GetDataSet(ByVal sqlQuery As String) As DataSet 
    ... 
     Fill(ds)... 
    ... 
    return ds 
    End Function 
End Module 

그리고 모든 페이지는 GetDataSet(sql)를 호출합니다. 나는 이것이 나쁜 생각이라고 가정하고있다. 최악의 경우 동시 호출자가 서로 다른 데이터를 가져올 수 있다는 것입니다.

답변

2
  1. 귀하의 문제가 아니라 설립 ... downvoting 시작합시다. 해결 방법은 모듈에서 "Dim ds .."를 GetDataSet 루틴으로 이동하는 것입니다. 그 다음에는 국부적으로, 스택에, 그리고 서로에게 발을 디딜 기회가 없습니다.

  2. 큰 문제는 클라이언트 코드에서 SQL 쿼리를 문자열로 작성하는 것이 좋은 응용 프로그램 설계가 아니라 SQL 유틸리티에서는 괜찮은 것일뿐입니다. 이 접근법은 Linq to SQL, Linq to Entities, Stored Procedures, 더 바람직한 DB 액세스 보안 모델을 사용하지 못하도록하고 아마도 SQL 주입 공격에 당신을 노출시킬 것입니다.

2

아주 좋지 않습니다. 이 아키텍처를 사용하면 매개 변수화 된 쿼리 나 저장 프로 시저를 사용하여 SQL Injection으로부터 자신을 보호 할 수있는 방법이 전혀 없습니다. 단지 시작일뿐입니다.

또한 강력하게 형식화 된 데이터 세트를 놓치게 될 것입니다.

0

나는 이와 비슷한 것을 사용하며 전혀 문제가 없었습니다. 데이터 액세스가 쉬워졌습니다. 나는 SQL을 쓰는 것에 신경 쓰지 않고 사실 내가 얻는 데이터가 정확히 무엇인지 이해하는 데 도움이된다. 데이터 액세스가 명확하게 분리되어 있으면 (즉, 동일한 위치에서 데이터를 일관되게 가져 오는 경우) SQL 문자열의 모든 데이터를 위생적으로 처리 할 수 ​​있습니다. 잘못된 점은 없습니다. 나는 공공 변수가 나쁘다는 것에 동의한다.

한숨 ... 또는 어쩌면 내가 나쁜 프로그래머 해요 : \ 동시 발신자에 대한

+0

쉽습니다. 그러나 그것은 좋은 연습이 아닙니다 (다시 특정 DB 관련 도구/유틸리티 제외). – RBarryYoung

+0

나는 그것이 좋은 연습인지 아닌지 항상 궁금해했습니다 ... 나는 내 지식으로 DB를 MySQL로 사용합니다 (정확하지 않을 수도 있습니다) linq 직접 번역하지 않습니다. 나는 내 SQL 문자열을 보는 것과 비슷하다. 하지만 DB에 액세스하는 모든 단일 장소에 대해 새로운 데이터 액세스 기능을 만드는 것이 더 나은 방법이라고 생각합니다. DRY는 어떻게 된거야? – Jason

+0

DRY = 자신을 반복하지 마십시오 : SQL을 저장 프로 시저에 넣으면 반복하지 않아도됩니다. 글쎄, 더 이상 당신이 묻힌 SQL (질문에). 사실은 영구적 인 구조화 된 데이터 (즉, 데이터베이스)를 사용하는 모든 애플리케이션에서 DRY를 완전히 적용 할 수 없다는 것입니다. 양식에 필드를 추가하려면 DB 변경과 그 사이의 코드 변경이 필요합니다. 데이터 유형 변경 등과 동일합니다. – RBarryYoung