2016-11-02 6 views
2

DB 열 메타 데이터를 처리하는 클래스가 있습니다. 클래스의 프로퍼티 중 하나가 해당 테이블입니다. 이것은 생성자를 통해 객체에 전달됩니다. 또한 생성자에서 클래스 내 다른 변수를 할당하는 로직을 적용합니다. 이렇게하려면 DB에 연결하고 테이블에 대해 쿼리하고 변수에 값을 반환하는 여러 개인 메서드가 있습니다.C# DB에서 데이터를 가져 오는 데 사용되는 메서드 수를 줄입니다.

제 문제는 다른 메소드가 많이 있지만 똑같은 일을하고 있지만 다른 데이터 유형을 반환한다는 것입니다. 그래서 예를 들어 내 코드는 다음과 같습니다.

public Column(string tableName) 
{ 
    strTableName = tableName; 
    pkColumnName = GetPKColumnName(tableName); 
    pkColumnLenght = GetPKColumnLenght(tableName); 
} 

private string GetPKColumnName(string tableName) 
{ 
    string query = String.Format("SELECT myColName FROM myTable where myTableName = {0}", tableName); 
    string result = ""; 
    try 
    { 
     using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString)) 
     { 
      con.Open(); 
      using (SqlCommand command = new SqlCommand(query, con)) 
      { 
      result = (string)command.ExecuteScalar(); 
      } 
     } 
    } 
    catch (SqlException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
return result; 
} 

private int GetPKColumnLenght(string tableName) 
    { 
     string query = String.Format("SELECT myColLenght FROM myTable where myTableName = {0}", tableName); 
     int result = 0; 
     try 
     { 
      using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString)) 
      { 
       con.Open(); 
       using (SqlCommand command = new SqlCommand(query, con)) 
       { 
       result = (int)command.ExecuteScalar(); 
       } 
      } 
     } 
     catch (SqlException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    return result; 
    } 

이렇게 많은 다른 방법이 있습니다. 이것은 나에게 잘 어울리지 않아서, 이런 식으로 최선의 방법이 무엇인지 궁금해하고있었습니다.

반환 유형을 객체로 선언하고 반환 된 값을 변수에 할당 할 때 데이터 유형 변환을 수행해야합니까?

+2

이 질문은 http://codereview.stackexchange.com/ 더 적합 –

+0

"반환 유형을 객체로 선언해야합니까?" 'Name'과'Length'를 캡슐화하고 반환하는 클래스를 정의하십시오. –

+1

SQL 삽입이나 다른 문제를 피하려면 매개 변수 기반 쿼리를 사용해야합니다. https://msdn.microsoft.com/library/bb738521(v=vs.100).aspx – eschneider

답변

0

두 번째 같은 일을 위해, 이제 방법을 SqlManager 클래스

public class SqlManager 
{ 

    public static string ConnectionString 
    { 
     get 
     { 
      return "Your ConnectionString" 
     } 
    } 

    public static SqlConnection GetSqlConnection(SqlCommand cmd) 
    { 
     if (cmd.Connection == null) 
     { 
      SqlConnection conn = new SqlConnection(ConnectionString); 

      conn.Open(); 

      cmd.Connection = conn; 

      return conn; 
     } 

     return cmd.Connection; 
    } 

    public static object ExecuteScalar(SqlCommand cmd) 
    { 

     SqlConnection conn = GetSqlConnection(cmd); 

     try 
     { 
      return cmd.ExecuteScalar(); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 

} 

만들기 :

private string GetPKColumnName(string tableName) 
{ 
    string query = String.Format("", tableName); 

    SqlCommand cmd = new SqlCommand(); 
    cmd.CommandText = @"SELECT myColName FROM myTable where myTableName = @TableName"; 

    cmd.Parameters.AddWithValue("@TableName", tableName); 

    object result = SqlManager.ExecuteScalar(cmd); 

    return result != null ? (int)object: 0; 
} 
1

내 대답과 다른 질문은 다른 가정으로 가정합니다. 특정 열의 단일 값을 쿼리하려고하고 유형이 다르기 때문에 새 메서드를 만들어야한다는 생각이 들게됩니다. 즉, 개인적으로는 단순한 ORM 솔루션을 사용하고 다른 대답은 틀린 것이 아니라 다른 추상화입니다.

제네릭을 사용하고 제네릭에 캐스팅하는 것이 좋습니다.

이 코드는 테스트하지 않았으므로 더 많은 지침입니다.

private T GetValue<T>(string tableName, colName) 
{ 
    string query = String.Format("SELECT {0} FROM myTable where myTableName = {1}", colName, tableName); 
    T result = default(T); 
    try 
    { 
     using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString)) 
     { 
      con.Open(); 
      using (SqlCommand command = new SqlCommand(query, con)) 
      { 
      result = (T)command.ExecuteScalar(); 
      } 
     } 
    } 
    catch (SqlException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
return result; 
} 
+0

궁금한 이유는 downvote, 너무 간청하지 않고 묻는 질문에 간결하게 대답합니다. –

+0

이것은 SQL 삽입에 개방적입니다. 응용 프로그램이 메서드에 상수 만 전달할 것으로 기대하지만 주입 할 물건을 전달하는 동적 SQL을 작성하는 것은 여전히 ​​실수 나 악의에 영향을받습니다. myTableName 매개 변수를 SQL 매개 변수로 수정하는 것 외에도 많은 작업을하지 않고도이 작업을 수행하는 안전한 방법은 'select *'를 실행 한 다음 적절한 값을 검색하는 것입니다. 'SqlDataReader '. –

+0

확실히 사실이지만,이 UI가 있다고 가정하고 있다고 생각하십니까? 내가 UI를 –