2008-11-08 6 views
3

우리는 에 대해 DB에 대한 모든 쿼리에 대해 저장 프로 시저를 사용하고 있습니다. 이 믿을 수 없을만큼 명사에 붙여서의 뜻을 나타냄 보인다 DRY :C# .NET에서 저장 프로 시저 DRY를 유지하는 방법?

  1. 디자인 테이블

하면 CRUD의 SP를 매개 변수를 작성하고 실행하는 해당 테이블

  • 디자인 코드 (바람직 클래스)에 대한
  • 디자인 CRUD 작업의 SP 우리는 하나의 열을 추가하거나 데이터 유형을 변경하기 위해 .NET 내부의 클래스에서 테이블, 소수의 SP 및 소수의 기능을 편집해야합니다.

    이 중복을 줄이기위한 팁은 무엇입니까?

    는 UPDATE : Vinko의 아이디어와 함께

    , 나는 this을 발견했다. 여기에 내가 그것을 필요로하는 사람들을 위해 함께했다 (C#에서) 코드의 비트는 다음과 같습니다 나는 그런 당신의 침전물 층을 생성하는 NetTiers 같은 코드 생성 도구를 사용하는 것이 좋습니다

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySQLConnString"].ConnectionString); 
    SqlCommand comm = new SqlCommand("NameOfStoredProcedure", conn); 
    comm.CommandType = CommandType.StoredProcedure; 
    
    conn.Open(); 
    SqlCommandBuilder.DeriveParameters(comm); 
    conn.Close(); 
    
    foreach (SqlParameter param in comm.Parameters) 
    { /* do stuff */ } 
    
  • +1

    등 SP는 더 반복 "끈적 거리는"매개 변수를 설정 통화를 한 줄을 만들어 드릴 것입니다 /msdn.microsoft.com/en-us/library/ms978509.aspx –

    답변

    2

    적어도 SP의 수정을 피하는 한 가지 팁은 내부 테이블 또는 information_schema 뷰에서 열 이름과 데이터 유형을 추론하는 '내성'을 사용하도록 작성하는 것입니다.

    쓰기가 더 복잡한 코드이지만 테이블이 변경 될 때마다 코드를 수정하지 않아도되며 나머지 SP에서도 재사용 할 수 있습니다.

    나머지 SP에서 호출 할 임시 테이블 (colname varchar, type varchar)을 사용하여 테이블을 설명하는 단일 SP를 만듭니다.

    하지만 쿼리가 복잡하면이 작업이 매우 복잡하고 실용적이지는 않지만, 그렇지 않은 경우 많은 문제가 발생할 수 있습니다.

    +0

    나는 실제로 이와 같은 것을 시작했지만, 나는 그것을하는 가장 좋은 방법으로 고심하고있다. 어떤 아이디어/예? –

    +0

    유용한 예제를 공유하기 위해 실제로 어떤 일을하고 있는지 좀 더 자세히 설명해야합니다. 그러나 여기에서 정보 스키마를 검색 할 수 있고 문제가있는 경우 필요한 모든 것을 얻기 위해 쿼리하는 방법을 찾을 수 있습니다. –

    2

    .

    +0

    Google은 'YAGNI'라고하는 반 패턴을 찾습니다. – dkretz

    +0

    이 답변입니까? 너 엘 케조 레이팅 해 줄래? –

    +0

    예. 실제로 모든 테이블이 네 가지 작업을 모두 필요로하는 것은 아닙니다. 그리고 모든 테이블이 동일한 C/R/U/D 패턴에 의해 적절하게 처리되는 것은 아닙니다.따라서 많은 경우에 사용되지 않는 코드를 작성하고 있습니다 (그러나 어쨌든 지원 부담이됩니다). – dkretz

    1

    OOP 디자인 원칙은 절차 코드 용이며 선언문 코드 용입니다. 특히, SP를 재사용하는 것은 매우 문제가됩니다.

    CRUD 생성기를 기반으로 한 UI 디자인의 이름이 잘 지정되었습니다. 사용자를 명시 적으로 데이터 입력 점원으로 전환시키는 또 다른 방법입니다. 이러한 기술을 사용하는 경우 생성되는 제품과 사용자가 처리해야하는 제품 사이에 뛰어난 추상화 계층이 있는지 확인하십시오. 우리는 하나의 열을 추가하거나 데이터 유형을 변경하는 경우

    , 우리는 테이블, SP를 한 줌, 및 .NET 내에서 클래스 함수의 소수를 편집 할 수 있습니다.

    데이터베이스 설계가 OOP 요구 사항을 지시하는 것과 같은 확실한 소리입니다. 대신 다른 방향에서 시작하십시오.

    1

    이러한 모든 메타 쿼리 접근법은 SQL이 단일 테이블을 넘어 서면 즉시 추적됩니다. 또는 계산 된 열을 원할 수도 있습니다. 또는 ...

    +0

    이것은 당신이 당신의 코멘트를 겨냥한 대답에 대한 코멘트로 가장 잘 놓여 있습니다. –

    +0

    BTW, 나는 그것이 매우 털이 쉽게 얻을 수 동의합니다. –

    +0

    일반적으로 나는 주석을 달았지만,이 경우에는 동일한 일반적인 접근법을 추진하는 몇 가지 응답을 다루고 있음을 주목하십시오 ... – dkretz

    0

    나는 이것이 실제로 DRY 가이드 라인에 해당한다고 생각하지 않습니다. 이것은 단지 지속성에 관한 것입니다. # 3을 수동으로 수행하는 경우이 작업을 쉽게 수행 할 수있는 도구 세트 중 하나를 채택해야합니다. LINQ to SQL은 개인적으로 좋아하지만 거기에는 많은 것들이 있습니다.

    # 2도 쉽게 자동화 할 수 있습니다. 1) 데이터 모델 설계 (개념) 2) 퍼시스턴스 계층에서 구현 (테이블 작성 또는 열 추가) 3) 응용 프로그램 수준에서이를 사용하십시오.

    1

    개인적으로 필자는 쿼리하는 코드를 저장 프로 시저에 넣는 데 큰 팬이 아닙니다. 매우 복잡한 일을 제외하고는 과다한 잔인 함처럼 보입니다. 내가

  • 내가
  • 내가 삽입, 업데이트, &는 각각의 발동을 삭제 만드는 각 테이블에 대한 뷰를 생성하는 데이터 모델을 만들

    1. : 여기

      내가 내 데이터베이스 및 침전물 객체 설계를 처리하는 방법 표.

    2. 모든 C# 코드는 뷰와 procs를 가리 킵니다.

    이 허용 나에게 :

    1. 는 매우 유연한 쿼리 대상 (뷰) 나 중복없이 필요한 모든 방법으로 뷰에 대한
    2. 쿼리 되세요. 데이터베이스 보안
    3. 추상 내가 내 코드를 깨지 않고 기본 데이터 모델을 리팩토링해야하는 경우에 데이터 모델을 통해 테이블 ​​
    4. 방지 직접 액세스
    (내가 아는 한,이 성능 비용이 수)

    목표 테이블을 나타내는 하나의 뷰를 갖는다면 많은 쿼리를 처리 할 수 ​​있습니다. 그렇지 않은 경우에도 최악의 상황은 쿼리에 대한 뷰를 생성해야하는 것입니다. 즉, 뷰를 생성하는 것과 동일한 뷰를 생성해야합니다. 그래서 아래쪽은 없다.

    SQL 인젝션 공격을 막기 위해 스토어드 프로 시저를 사용하는 사람들이 있지만 뷰를 쿼리 할 때 매개 변수화 된 쿼리를 사용하면 문제가되지 않습니다. ... 그리고 항상 매개 변수화 된 쿼리를 사용합니다 ... 맞습니까? ;-)

  • 0

    CRUD가없는 일부 테이블이 있으며 응용 프로그램에서 액세스 할 수 없어야하며 데이터베이스 구현 모델의 아티팩트입니다. 특히, 다 대 다 링크 테이블은 응용 프로그램에서 액세스하면 안되며 저장 프로 시저를 통해 데이터베이스에서 관리해야합니다.

    1

    사용하는 'DeriveParameters'접근 방식은 작동하지만 각 요청에 대해 2 번의 데이터베이스 트립이 필요합니다. 이 방법으로 성능이 저하됩니다. Microsoft의 데이터 액세스 응용 프로그램 블록 SqlHelper 클래스는 똑같은 '내성'을 수행하지만 재사용을위한 선택적 매개 변수 캐싱을 통해이를 완화합니다. HTTP :/이것은 당신이 당신은 모든 테이블에 대해 CRUD 저장 발동을 만들기 전에이 흥미로운 읽기를 찾을 수 있습니다

    http://msdn.microsoft.com/en-us/library/cc309504.aspx