1

나는 계층화 된 접근 방식으로 내 응용 프로그램을 설계했습니다. 각 인터페이스와 공통 데이터 액세스 레이어에 대한 BusinessOP 레이어가 있습니다. 내 데이터 액세스 계층에서이 같은 데이터 판독기 메서드가 있습니다.메서드 매개 변수화

 public SqlDataReader executeQuerys(string query01) 
    { 
     SqlConnection con = null; 
     SqlCommand com = null; 
     try 
     { 
      con = new SqlConnection(DBConnect.makeConnection()); 
      con.Open(); 
      com = new SqlCommand(query01, con); 
      return com.ExecuteReader(CommandBehavior.CloseConnection); 
     } 

     catch 
     { 
      com.Dispose(); 
      con.Close(); 
      throw; 
     } 

이것은 내 DBConnection 계층의 코드입니다.

 public static string makeConnection() 
    { 
     string con = ConfigurationManager.ConnectionStrings["MyDB.Properties.Settings.ConString"].ToString(); 
     return con; 
    } 

내 비즈니스 계층에는 특정 저장 프로 시저를 호출하는 메소드가 있습니다. 내 사업 실시 층 안전하지 않은이므로

 public SqlDataReader getLGDivID(string divName) 
    { 
     string query = "EXEC getLGDivID'" + divName + "'"; 
     return new DataAccessLayer().executeQuerys(query); 
    } 

, 나는 내가 매개 변수를 전달하는 문자열 연결을 사용하고 여기에 매개 변수가있는 쿼리와 함께 그것을 갖고 싶어. 아무도 그것을 수정하는 방법을 나에게 암시 할 수 있습니까?

당신은 당신의 기능을 조금 변경할 수 있습니다
+1

사이드 참고 : 당신이해야 항상'.Dispose'뿐만 아니라 당신이 예외를 잡을 때. – Silvermind

답변

3

: 다음

public SqlDataReader executeQuerys(string query01, string paramName, string value) 
{ 
    SqlConnection con = null; 
    SqlCommand com = null; 
    try 
    { 
     con = new SqlConnection(DBConnect.makeConnection()); 
     con.Open(); 
     com = new SqlCommand(query01, con); 
     com.Parameters.AddWithValue(paramName, value); 
     com.Dispose(); 
     con.Close(); 
    } 
    catch 
    { 
     com.Dispose(); 
     con.Close(); 
     throw; 
    } 
    return com.ExecuteReader(CommandBehavior.CloseConnection); 
} 

는이 기능을 사용하려면

public SqlDataReader getLGDivID(string divName) 
{ 
    string query = "EXEC getLGDivID @divName"; 
    return new DataAccessLayer().executeQuerys(query, "@divName", divName); 
} 

편집이 : @silvermind는 지적

, 당신이해야 연결을 올바르게 처리하십시오. 지금 가지고있는 방법으로 예외를 잡을 때만 연결을 처리합니다.

이것은 나쁜 예를 들어, IDisposable의 사용을합니다

public SqlDataReader executeQuerys(string query01, string paramName, string value) 
{ 
    using (SqlConnection con = new SqlConnection(DBConnect.makeConnection())) 
    { 
     try 
     { 
      con.Open(); 
      com = new SqlCommand(query01, con); 
      com.Parameters.AddWithValue(paramName, value); 
     } 
     catch(SqlException ex) 
     { 
      //Handle the exceptio 
      //no need to dispose connection manually 
      //using statement will take care of that 
     } 
    } 
    return com.ExecuteReader(CommandBehavior.CloseConnection); 
} 
+1

답변을 개선하기 위해 블록을 사용하여 적절한 처리 방법을 제시하는 것이 좋습니다. :) – Silvermind

+0

@ Silvermind 나는 내 대답 덕분에 확대! – meda

+0

@meda이 오류는 나를 오류가 발생합니다. DataAccessLayer.executeQuerys (문자열, 문자열, 문자열) ': 모든 코드 경로가 값을 반환하지 않습니다. – chathwind