2014-09-17 2 views
1

MSSQL 데이터베이스에서 정보를 가져 오는 도구를 개발 중입니다. 액세스 용 사용자 데이터베이스는 입니다. 정적을 사용하는 방법을 알고 있지만이 경우에는 확실하지 않습니다.C# 데이터베이스가 정적인지 여부

class Database 
    { 
     private const String connString = "the connection string"; 
     private const String query1 = ""; 

     public Database() 
     { 
      // some initialization 
     } 

     // some different methods which calls CreateCommand and a queryString and 
     // returns the result 

     private static void CreateCommand(string queryString, string connectionString) 
     { 
      using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
      { 
       sqlConnection.Open(); 
       using (SqlCommand command = new SqlCommand(queryString, sqlConnection)) 
       { 
        using (SqlDataReader dataReader = command.ExecuteReader()) 
        { 
         if (dataReader != null) 
         { 
          while (dataReader.Read()) 
          { 

          } 
         } 
        } 
       } 
      } 
     } 
    } 

내가 서버에서 데이터를 얻으려면 선택 쿼리가 있습니다

는 나는 자신의 데이터베이스 클래스가 있습니다. 자신의 스레드는 예를 들어 매시간마다 결과를 표시하는 등 일부 데이터베이스 메소드를 호출합니다. createCommand 메서드 만 정적 또는 정적이 아닌 정적 클래스 및 정적 메서드를 사용해야합니까?

종류가

+0

당신은 단위 프로젝트를 테스트합니까? 그렇다면 정적 방법을 사용하지 마십시오. 그들은 시험하기가 어렵습니다. –

+0

이 방법을 사용하면 모든 SQL 문을 열고 실행하고 닫을 수 있습니다. 이는 매우 경제적입니다. 특히 1 시간 작업이 시작될 때마다 10 개의 쿼리를 실행하는 경우가 있습니다. – Belogix

+1

교육용입니까? 그렇지 않다면 많은 기존 ORM 중 하나를 사용하는 것이 좋습니다. [Entity Framework] (http://msdn.microsoft.com/nl-be/data/ef.aspx), [NHibernate] (http : // nhforge. org /), [Dapper] (https://github.com/StackExchange/dapper-dot-net), ... – Stijn

답변

2

특정 경우를 제외하고는 정적 방법은 테스트 가능성을 줄이고 디자인이 밀접하게 결합되므로 피해야합니다. 전체 토론이 사이트의 범위 밖이지만, 현재 장소의 몇 시작 :

http://objcsharp.wordpress.com/2013/07/08/why-static-code-is-bad/ 귀하의 경우에는 http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

은, 그러나, 정적 방법은 BG100으로 지적하는 개인이다 , 인스턴스화 된 클래스의 컨텍스트에서 의미가없는 것 같습니다. 왜 그냥 인스턴스 (비 정적) 메소드를 선언하고 생성자에서 연결 문자열에 전달하여 유연한 코드를 유지하지 :

class Database 
{ 
    private string connString; 

    public Database(string connString) 
    { 
     this.connString = connString; 
    } 

    private void CreateCommand(string queryString) 
    { 
     using (SqlConnection sqlConnection = new SqlConnection(this.connString)) 
     { 
      // etc. 
     } 
    } 
} 

을하지만 지금 당신은 당신의 CreateCommand 무효 반환하는 문제가있다. 독자로부터 데이터를 읽은 후 어떻게 호출 메소드에 반환합니까? 아마 당신은 대신 데이터 집합을 사용하여 살펴 보도록한다 :

https://stackoverflow.com/a/4099694/289319

+0

고마워, 나는 이제 그것을 어떻게 사용하는지 안다. 죄송합니다 잘못된 코드 난 그냥 사용하지 않고 그것을 테스트하고 정적 메서드. 나는 새로운 코드를 만들고이 경우 static을 사용하는 것이 낫지 만, 내가 의미하는 바를 거의 알고있는 코드만을 사용하기 때문에 물었다. 프로젝트가이 경우와 같이 매우 작 으면 항상 좋은 코드를 만들려고 노력합니다. =) – user2571670

1

내가 정적 방법을 설명하기 위해 생각할 수있는 simpliest 방법과 관련, 정적으로 당신의 CreateCommand 방법을 선언하는 경우, 다음은 (connString 및 쿼리 1) 멤버 변수에 접근하지 못할 것이라고 말을하는 것입니다 그 메서드 내에서 ... 그래서 당신이 명확하게 액세스 할 필요가, 당신은 정적으로 메서드를 선언 할 수 없습니다.

따라서 대답은 아니오입니다. 그러면 메소드가 더 이상 작동하지 않으므로 정적으로 선언하지 마십시오.

일부 의견에서 언급했듯이 해결해야 할 몇 가지 수정 사항이 있지만이 내용은이 질문의 범위를 벗어납니다.

+0

아, 네가 맞아, 내 잘못이야, 거기서 내가 자주 사용하지 않거나 정적이 필요 없다는 것을 알 수있다. – user2571670