2017-01-09 6 views
-1

지금은 데이터와 같은가 어떻게 asp.net MVC 프로젝트에 내 SQL 쿼리 스크립트를 관리 할 수 ​​있습니다

코드를 처리하기 위해 단정을 사용 : 위의이 같은 많은 SQL 스크립트를 작성합니다

using(var connection = new SqlConnection(ConfigurationManager.AppSettings["MyConnectString"]) 
{ 
    var sql = string.Format(
     @"SELECT [Column1] 
      FROM [MyTable] 
      WHERE [Column3] > {0} 
       AND [Column4] < {1}" 
     , myValue1 
     , myValue2 
    ); 
    var result = connection.Query<long>(sql).ToList(); 
} 

내 프로젝트를.

나는

가 그럼 난 파일에서 스크립트를로드 할 수 있습니다 (... 더 나은 어쩌면 QueryAccount.config, QueryOrder.config (XML 형식) ... 또는 다른 사람) 파일에 스크립트를 작성하려면 .. .


는 내가 원하는 파일 내 스크립트, 그때 파일에 동일한 클래스 쓰기 쓰기입니다. (. 예를 들어 나는 Product.config의 모든 쿼리 제품 스크립트를 작성하고, Order.config의 모든 쿼리 주문 스크립트) 그리고 내가 좋아하는

var cmd = MyCommandManager.GetScript("QueryProduct"); 
cmd.SetParam("@ProductId", 123); 
cmd.SetParam("@InvoicingDate", DateTime.Now(-7)) 
... 

스크립트와 같은 파일에서 사용할 :

SELECT [ProductName] 
FROM [Product] 
WHERE [ProductId] = @ProductId 
    AND [InvoicingDate] = @InvoicingDate 
+4

당신이 SQL 주입 공격을 요구하고 있습니다! –

+3

왜 그걸 원하니? –

+0

각 스크립트에 대해 저장 프로 시저를 만든 다음 매개 변수가있는 저장 프로 시저를 호출해야합니다. 그것은 SQL 주입을 피할 것이다. –

답변

1

당신이 만약 데이터베이스에 대한 완전한 액세스 권한을 가지고 있으므로 Stored Procedure을 구현하여 SQL 텍스트를 저장할 수 있습니다.

using(var cn = new SqlConnection("MyConnectionString")) 
{ 
    cn.Open(); 
    return cn.Query<MyModel>("MyProcName", new { Parameter1 = myValue1, Parameter2 = myValue2 }, commandType: CommandType.StoredProcedure); 
} 

을에 값을 SQL Paramters를 사용하는 대신 주입 : 당신이해야 할 모든이 말끔 쿼리에서 저장된 프로 시저 이름을 참조와의 StoredProcedure에 명령 유형을 설정하고 그래서 같이 갈 수있을 것입니다 당신의 쿼리는 SQL Injection 공격을 막기 때문에 매우 현명한 일입니다. 이렇게하면 쿼리를 다시 포맷하면 도움이됩니다.

@"SELECT [Column1] 
    FROM [MyTable] 
    WHERE [Column3] > @Parameter1 
    AND [Column4] < @Parameter2" 

매개 변수 이름이 위의 dapper 호출과 일치하는지 확인하십시오. 그러나 저장 프로 시저를 사용하지 않을 때는 대개 내 "저장소"에 대한 쿼리를 참조하는 클래스 상단에 private const string을 만듭니다. 각 클래스는 일반적으로 하나 개의 쿼리가 있기 때문에 나는 Command/Query Pattern like this one에 가입

public class QueryClass 
{ 
    private const string query = "SELECT * FROM Table1"; 

    public IEnumerable<MyModel> CallQuery() 
    { 
     // Dapper Query Details 
    } 
} 

그래서 쿼리 저장에 문제가 없다. 당신이 명령/쿼리 패턴을 좋아하는 경우에

편집

, 나는이 같은 패턴의 좋은 구현은 당신이 MediatR을 확인하시기 바랍니다.

SECOND 편집

나는 내가 그에 대해 조언을하고자 할 수 있지만 경우, 설정 파일의 일종으로 SQL 쿼리를 추가하여 무엇을하려고 참조하십시오. 마지막으로 모든 SQL 쿼리는 응용 프로그램에 컴파일 된 XML 파일에 저장되었습니다. 이는 쿼리를 관리하는 효과적인 방법처럼 보였지만 응용 프로그램이 몇 개의 SQL XML 파일로 증가하면 어떤 쿼리를 찾을 수 있는지 관리하는 데 어려움을 겪었으며 결국에는 여러 XML 파일에 쿼리가 중복되어 나타납니다. 우리는 또한 오타 및 기타 XML 구조 오류에 많은 문제가 있었지만 런타임 전까지는 잡히지 않았습니다. 그러나 필자는 오타가있을 수 있으므로 어떤 문자열에도 입력 할 필요가 없습니다. 그것은 엉망이되어 결국 해결되는 것보다 더 많은 문제를 일으킨다.

가능한 한 코드에 가깝게 SQL 쿼리 텍스트를 사용하는 것이 더 나은 대안이며, 네임 스페이스 및 쿼리 개체 구성에 대해 영리한 개발자라면 쉽게 쿼리를 찾을 수 있다고 생각합니다. Intellisense를 통해.

0

downvoters를 무시하십시오. SQL은 항상 자체 파일에 있어야합니다. 이 파일의 확장자는 .config가 아니라 .sql이어야합니다. 따라서 VS SQL 편집기에서 편집 할 수 있습니다. 내가 생각하는 쿼리 당 하나의 파일을 원한다. 동일한 파일에서 다른 쿼리를 그룹화하면 아무 것도 얻을 수 없습니다. 이 파일들을 소비하는 .cs 파일 옆에 두는 것을지지하고, 함께 여는 파일을 함께 그룹화하며, 언젠가는 함께 삭제하려는 파일을 옹호 할 것입니다.

일단 생성되면 솔루션 탐색기에서 속성 -> 빌드 작업 -> 포함 리소스를 마우스 오른쪽 단추로 클릭하십시오. 그런 다음 MyCommandManager.GetScript() 메서드에서 GetManifestResourceStream()을 사용하여 쿼리 텍스트에 액세스합니다. 스토어드 프로 시저와 비교할 때 이것은 호출 코드로 쿼리를 컴파일하는 큰 이점이 있으므로 스토어드 프로 시저 버전과 애플리케이션을 동기화하는 것에 대해 걱정할 필요가 없습니다.

이 모든 것이 많은 작업처럼 보인다면, 다소 있습니다. 그렇기 때문에 아무도 그것을하지 않는 이유는 무엇입니까? :-) 그래프트 QueryFirst을 잡아라. 그러면 너와 다른 많은 것들이 끝날 것이다. 면책 조항 : QueryFirst를 작성했습니다.