2011-01-04 7 views
3

많은 저장 프로 시저가 있습니다.저장 프로 시저를 사용하는 방법?

public class DBHandler 
{ 
    private static Database db = DatabaseFactory.CreateDatabase("db"); 

    public static DataTable GetItems(long filterId) 
    { 
     DbCommand command = db.GetStoredProcCommand("dbo.P_GetItems"); 
     db.AddInParameter(command, "@filter_id", DbType.Int64, filterId); 
     IDataReader reader = db.ExecuteReader(command); 
     DataTable dt= new DataTable(); 
     dt.Load(reader, LoadOption.OverwriteChanges); 
     reader.Close(); 
     return dt; 
    } 
    . 
    . 
    . 
    . 
} 

내가 쓴대로, 나는 많은 저장 프로 시저가이 코드는 성가신 반복 : 그들을 사용하기 위해서 나는이 같은 정적 방법과 정적 클래스를 만듭니다. 저장 프로 시저를 호출하는 더 좋은 방법이 있습니까?

답변

1

간단한 LINQ 쿼리에서 사용할 수있는 데이터 컨텍스트 코드를 자동으로 생성하려면 명령 줄 유틸리티 sqlmetal.exe을 사용할 수 있습니다.

1

다양한 DAL을 살펴보십시오. 우리는 연결, 명령 및 판독기 개체에 대해 IDisposable requriements를 마무리하는 데 도움이되는 자체 개발 솔루션을 보유하고 있습니다. 또한 인수 전달 및 변환을 단순화합니다. 그러나 그것은 로켓 수술이 아닙니다. 나는 많은 옵션이 있다고 확신합니다.

0

나는이 같은 일을 좋아한다 :

public static IEnumerable<IDataRecord> SqlRetrieve(string ConnectionString, string StoredProcName, Action<SqlCommand> addParameters) 
    { 
     using (SqlConnection cn = new SqlConnection(ConnectionString)) 
     using (SqlCommand cmd = new SqlCommand(StoredProcName, cn)) 
     { 
      cn.Open(); 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      if (addParameters != null) 
      { 
       addParameters(cmd); 
      } 

      using (SqlDataReader rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
        yield return rdr; 
      } 
     } 
    } 

당신이 여기에 도착하는 것은 재사용 열거입니다이 매개 변수를 제공하는 대리자를 걸립니다 (테이블을 반환하는이 변경 될 수 있습니다).

foreach (var dr in 
     SqlRetrieve(cn, sp, 
        delegate (SqlCommand cmd) { 
         cmd.Parameters.Add("@paramname", System.Data.SqlDbType.Int).Value = someint; 
        } 
     ) 
) { 
} 

그래서 당신은 모든 동일한 코드를 반복하지 않는 단지 매개 변수 부분 : 실제 사용에서

, 그것은 다음과 같이 보입니다. 귀하의 경우, DataReader 루프에서 많은 코드를 가져 오는 대신 DataTables를 항상 반환하는 경우 코드가 훨씬 간단해질 수 있습니다.

관련 문제