2009-10-07 6 views
0

내 프로젝트에서 SQLCLR을 사용하고 있으며 기록을 위해 매우 기쁩니다. 그러나 좋은 데이터 액세스 패턴에 대한 정보를 얻을 수는 없습니다.SQLCLR의 데이터 액세스 패턴

일반적으로 내 데이터베이스의 API를 원하기 때문에 저장 프로 시저를 사용하여 .net과 SQL 간의 통신을 수행합니다. 그러나이 경우 .net 코드는 API의 일부이므로 SP가 좋지 않은 것처럼 보입니다.

Linq2SQL은 SQL 서버에 존재하지 않지만 (DBA는 원하지 않는 일을해서 설치할 수 있음), 옵션이 아닙니다. 내가 현재 가지고있는

는 작동하지만, 그것은 단지 매우 그것을 할 잘못된 방법처럼 보인다,

using (SqlCommand cmd = c.CreateCommand()) { 
    cmd.CommandText = "SELECT ... FROM ..."; 
    using (SqlDataReader rdr = cmd.ExecuteReader()) { 
     DoSomething(rdr); 
    } 
} 

와 같은 표준 ADO.NET 코드로 어수선하게 내 코드입니다.

다른 사람들이 어떻게합니까?

답변

1

저는 XSLT를 사용하여 DAL 용 C# 코드를 생성합니다. 나는 보통 데이터베이스 정의 (예 : SELECT name, type, length, ... FROM sys.columns JOIN sys.tables JOIN sys.types FOR XML PATH의 일부 양식)에서 XML을로드하고 코드 생성을 위해 사용자 정의 XSLT 변환을 개발했습니다. 나는이 블로그와 비슷한 Visual Studio 빌드 프로세스 자체의 일부로 추가했습니다. 블로그는 http://rusanu.com/2009/04/11/using-xslt-to-generate-performance-counters-code/입니다 (블로그는 성능 카운터 생성과 관련되어 있지만 DAL 코드에도 적용됩니다). 또한 XSLT 코드 gen을 사용하여 결과 집합의 형식을 만듭니다.

무거운 클라이언트에있는 동안이 접근법은 ORM 및 ADO 데이터 집합 기능과 겹치지 만 (나는 여전히 그 클라이언트에서 사용하지만 그게 내 문제입니다 ...), SQLCR에서는 SQLCLR 특정 제한으로 인해 가장 적합합니다. .

이 접근법은 무엇보다 먼저 유연한이며 코드베이스 (외부 종속성이없고 외부에서 도입 된 버그 없음)에 대한 절대적인 제어권을 유지하면서 모든 DAL 진입 점에 영향을 미치는 전역 변경을 신속하게 수행 할 수있게 해줍니다. ADO 데이터 세트와 비교할 때 extreamly lightweight입니다.

IQueryable 개체를 전달할 때의 부가 가치 때문에 LINQ에 대해서만이 접근 방식을 사용합니다. 그러나 SQLCLR에서는 아시다시피이 옵션이 아직 실행 가능하지 않습니다.

+0

실제로 SQLCLR이 아닌 SQL에서 동일한 결과를 얻었지만 내 솔루션은 Where 절을 생성하기 위해 Expression.Your (식)에 의존합니다. where 절을 어떻게 생성합니까? – erikkallen

+0

지금까지 복잡한 표현식을 생성 할 필요가 없었습니다. 난 항상 열쇠 중 하나에 의해 항목을 조회하고 간단한 조회 방법 (WHERE key @ value)은 XSLT에서 생성됩니다. Jonathan에 대한 답변을 판단 할 때 컴파일 타임이 아닌 런타임에 필요한 것이 있습니다. –

+0

아니요,이 경우 복잡한 논리에서 사용하는 메타 데이터를 찾는 간단한 쿼리에 관심이 있습니다. – erikkallen

0

SQLCLR이 적절한 세트 기반 TSQL보다 실제로 성능 이득을 제공하는 제한된 장소에 대해 위에서 설명한 방법대로 데이터 액세스를 수행합니다. 집합 기반, XML 구문 분석 또는 SQLCLR을 실제로 사용해야하는 극도로 복잡한 수학을 수행 할 수없는 꽤 무거운 루프 기반 처리를 수행해야합니다. SQLCLR을 데이터 액세스 용으로 만 사용하는 경우 성능 저하를 초래합니다. 이 데모에 대해 알고 싶으면 작년에 내 프레젠테이션에서 AdventureWorks에 대한 예제를 가져와야합니다.

+0

SQLCLR의 주요 용도는 일부 테이블의 메타 데이터를 사용하여 DSL에서 SQL을 생성하는 것입니다.이것은 T-SQL에서 처리하는 데 엄청난 번거 로움이 될 것입니다. 내 문제는 성능과 관련이 없지만 유지 보수성 및 일반적인 좋은 스타일과 관련되어 있습니다. – erikkallen

+0

SQLCLR에서 동적으로 결과 TSQL을 작성하는 경우 TSQL에서 동일한 작업을 수행하고 sp_executesql을 사용하여 TSQL의 매개 변수화로 호출 할 수 있습니다. 이 경우 동일한 작업에 대해 sp_executesql의 성능이 동등한 SQLCLR보다 빠르며 코드도 관리가 가능해야합니다. SQLCLR은 성능을 향상시키는 훌륭한 도구이지만 "보다 친숙한"코드 관리 효율성을 고려하는 경우에도 데이터 액세스 작업 만 수행하는 작업에 대해 성능을 현저하게 저하시킬 수 있습니다. –

+0

동적 SQL에 대한 Erland Sommarskog의 기사에서 다음과 같이 복잡성을 달성하기 위해 TSQL에서 동적 코드를 사용하는 방법을 설명합니다. http://www.sommarskog.se/dynamic_sql.html –

관련 문제