2010-04-13 5 views
4

SQL에서 물건을 얻는 데 사용하는이 작은 방법이 있습니다. 나는 varSearch = "" 또는 varSearch = "something"으로 부릅니다. 이 방법으로 작성된 메서드를 사용하는 것이 가장 좋은지 또는 두 메서드 (오버로딩)로 나누는 것이 더 좋을까요, 아니면 어쨌든 전체적으로 WHERE clausule을 매개 변수화 할 수 있습니까?이 방법은 C#에서 SQL 값을 가져 오는 좋은 방법입니까?

private void sqlPobierzKontrahentDaneKlienta(ListView varListView, string varSearch) { 
     varListView.BeginUpdate(); 
     varListView.Items.Clear(); 
     string preparedCommand; 
     if (varSearch == "") { 
      preparedCommand = @" 
       SELECT t1.[KlienciID], 
       CASE WHEN t2.[PodmiotRodzaj] = 'Firma' THEN 
          t2.[PodmiotFirmaNazwa] ELSE 
          t2.[PodmiotOsobaNazwisko] + ' ' + t2.[PodmiotOsobaImie] END AS 'Nazwa' 
       FROM [BazaZarzadzanie].[dbo].[Klienci] t1 
       INNER JOIN [BazaZarzadzanie].[dbo].[Podmioty] t2 
       ON t1.[PodmiotID] = t2.[PodmiotID] 
       ORDER BY t1.[KlienciID]"; 
     } else { 
      preparedCommand = @" 
       SELECT t1.[KlienciID], 
       CASE WHEN t2.[PodmiotRodzaj] = 'Firma' THEN 
          t2.[PodmiotFirmaNazwa] ELSE 
          t2.[PodmiotOsobaNazwisko] + ' ' + t2.[PodmiotOsobaImie] END AS 'Nazwa' 
       FROM [BazaZarzadzanie].[dbo].[Klienci] t1 
       INNER JOIN [BazaZarzadzanie].[dbo].[Podmioty] t2 
       ON t1.[PodmiotID] = t2.[PodmiotID] 
       WHERE t2.[PodmiotOsobaNazwisko] LIKE @searchValue OR t2.[PodmiotFirmaNazwa] LIKE @searchValue OR t2.[PodmiotOsobaImie] LIKE @searchValue 
       ORDER BY t1.[KlienciID]"; 
     } 
     using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (SqlCommand sqlQuery = new SqlCommand(preparedCommand, varConnection)) { 
      sqlQuery.Parameters.AddWithValue("@searchValue", "%" + varSearch + "%"); 
      using (SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader()) 
       if (sqlQueryResult != null) { 
        while (sqlQueryResult.Read()) { 
         string varKontrahenciID = sqlQueryResult["KlienciID"].ToString(); 
         string varKontrahent = sqlQueryResult["Nazwa"].ToString(); 
         ListViewItem item = new ListViewItem(varKontrahenciID, 0); 
         item.SubItems.Add(varKontrahent); 
         varListView.Items.AddRange(new[] {item}); 
        } 
       } 
     } 
     varListView.EndUpdate(); 
    } 
+4

코드에는 별다른 차이가 없지만 LINQ2SQL 또는 ADO.NET Entity Framework를 사용해 보셨습니까? –

+0

대부분의 프레임 워크가 영어이므로 코드를 영어로 사용하는 것이 좋습니다 (영어 원어민도 아닙니다). 영어를 사용하면 코드가 더 잘 통합됩니다. 예를 들어, "hinzufügen"(add는 독일어)를 사용하거나 프레임 워크 클래스의 하위 클래스이고 "override"해야하므로 "add"를 사용하는 것이 좋습니다. – dbemerlin

+0

나는 프로그램이 네이티브 언어가 아니라면 항상 이해합니다. 나는 항상 영어를 사용합니다. 그러나 제가 독서하는 유일한 사람이기 때문에 비즈니스 용어와 이름을 영어로 번역하는 것은 의미가 없습니다. 글을 쓰는 것이고 폴란드어와 다른 언어는 될 수 없습니다. – MadBoy

답변

6

실제로 더 나은 방법은 SQL을 응용 프로그램에 하드 코딩하는 대신 저장 프로 시저를 사용하는 것입니다. 저장 프로 시저에 where 절 매개 변수를 전달하고 데이터베이스 측에서 논리를 처리 할 수 ​​있습니다.

이 접근법은 다른 응용 프로그램 (예 : JAVA 응용 프로그램)에서이 논리가 필요한 경우 논리를 데이터베이스에 중앙 집중식으로 다시 작성하지 않아도된다는 장점이 있습니다.

+0

Frans Bouma의 멋진 로그 포스트를 간략하게 읽어보십시오. 당신이 간과하는 흥미로운 부분에 대한 저장 프로 시저가 있습니다. 간단히 말해서 : 당신의 접근 방식은 구조적으로 중요하게 짜증을냅니다. 그리고 당신은 그럴만 한 가치가없는 가격으로 (가정 한) 이익을 사게됩니다. 전체적으로 http://weblogs.asp.net/fbouma/search.aspx?q=stored+procedure&o=Relevance에서 시작할 수 있습니다. http://weblogs.asp.net/fbouma/archive/2006/05/26/Yay_2100_-A-new-Stored-Proc-vs.-Dyn.-Sql-battle_2100_.aspx는 핵심 아티클입니다. – TomTom

0

내가 저장 프로 시저를 사용하여 같은이 더 나은 방법이있다 확신합니다,하지만 당신은 정말이 작업을 수행해야하는 경우가 필요합니다

 string preparedCommandTemplate = @" 
         SELECT t1.[KlienciID], 
         CASE WHEN t2.[PodmiotRodzaj] = 'Firma' THEN 
            t2.[PodmiotFirmaNazwa] ELSE 
            t2.[PodmiotOsobaNazwisko] + ' ' + t2.[PodmiotOsobaImie] END AS 'Nazwa' 
         FROM [BazaZarzadzanie].[dbo].[Klienci] t1 
         INNER JOIN [BazaZarzadzanie].[dbo].[Podmioty] t2 
         ON t1.[PodmiotID] = t2.[PodmiotID] {0} 
         ORDER BY t1.[KlienciID]"; 
string whereClause="WHERE t2.[PodmiotOsobaNazwisko] LIKE @searchValue OR t2.[PodmiotFirmaNazwa] LIKE @searchValue OR t2.[PodmiotOsobaImie] LIKE @searchValue" 

if (string.Emtpy.Equals(varSearch)) { 
      preparedCommand = string.Format(preparedCommandTemplate,string.Empty) 
     } else { 
      preparedCommand = string.Format(preparedCommandTemplate,whereCaluse) 

     } 
+0

구문이 다소 벗어 났을 수 있습니다. – Midhat

+0

문자열 병합을 사용하는 것이 "허용"되지 않았거나 SQL 주입으로 인해 낙담 한 것으로 생각했습니다! – MadBoy

+0

ORDER BY 외에도 WHERE 뒤에 있어야하므로 실제로 whereClausue, string orderBy라는 문자열을 추가로 병합해야합니다. 그러나 내가 전에 말했던 것처럼 그것은 전체에서 SO에 downvoted되고있다 :) – MadBoy

0

저장 프로 시저를 사용하지 않으려면, 적어도 where 절을 매개 변수 화하십시오. 이러한 종류의 코드는 신속하게 처리 할 수 ​​없습니다. 또한 무료 텍스트 인덱스 또는 Lucene.NET과 같은 것을 사용하여 여러 필드에서 "유사"검색을 구현하는 방법을 고려할 것입니다.

3

은 여러 단계에 바보 :

  • NO DAL을 전혀 - 이것은 당신의 SQL 코드가 모든 형태의 떠들석을 의미합니다. 끔찍한 유지 보수 - 최소한 모든 SQL 처리를 하나의 클래스로 만드십시오.

  • 많은 수작업으로 작성된 코드이므로 성능이 현저합니다 (예 : 프로그래머 성능). RUNTIME에 모든 코드를 생성 할 수있는 방법에 대한 BLToolkit을보십시오 (실제 메소드가있는 서브 클래스는 생성 된 바이트 코드입니다).

그렇다면 NHibernate와 같은 실제 데이터 액세스 레이어/ORM을 사용하도록 설득 할 수 없다면 말입니다.

포어 1 나는 프로그래머로서 당신을 해고시킬 것입니다 (연수생으로 다시 돌아 오십시오). SQL을 형태로 사용하는 것은 데이터베이스를 재 작업 할 때 시간을 소비 할 생각이 아닙니다. 테스트 할 수없고 유지하기가 쉽지 않습니다. 이것은 btw입니다. - "그물 특정"하지 SQL을 분리하는 것은 내가 스몰 토크 이미 C++ 20 년 전 (거의) 한 무언가이다 - 잘 - 나는 것 2 용)

이 지침에 의한 일어나지 않을 것이다)

+0

Harse,하지만 공평합니다. –

+0

필자는 프로그래머가 아니라 관리자에게 주어진 작업이 아직 수행자가 아니라고 생각합니다 .- – MadBoy

0

코드에서 하드 코드 된 SQL 문을 계속 사용하고 LINQ2SQL 또는 Entity Framework 또는 다른 ORM 도구로 전환하지 않으려는 경우 이 아닌을 수행하려는 경우 where 절을 매개 변수를 메서드에 추가합니다 ('where 매개 변수를 매개 변수화하는 것이 무엇을 의미하는지'). 그러면이 방법을 사용하는 클라이언트가 데이터 액세스 기술 (이 경우 SQL 데이터베이스)에 종속됩니다.

sqlPobierzKontrahentDaneKlienta(lv, "something"); 

sqlPobierzKontrahentDaneKlienta(lv, 
    "WHERE t2.[PodmiotOsobaNazwisko] LIKE '%something%' OR " + 
    "  t2.[PodmiotFirmaNazwa] LIKE '%something%' OR " + 
    "  t2.[PodmiotOsobaImie] LIKE '%something%'") 

하나가 더 나은 같습니다

는 다음과 같은 두 가지 통화를 비교?

+0

BY 매개 변수는'sqlQuery.Parameters.AddWithValue ("@ whereClausule", whereClausulule); 및 추가 매개 변수가 아닙니다. 방법에. 하지만 그런 생각은 허용되지 않습니다. – MadBoy

+0

아, 좋아. 그것은 실제로 허용되지 않습니다. –

관련 문제