2012-02-04 2 views
2

Access 데이터베이스에서 많은 양의 데이터를 읽는 데 사용하는 다음 클래스가 있습니다.모범 사례 : 데이터 액세스 클래스 만들기

public class ConnectToAccess 
{ 
    private readonly string _connectionString; 

    public ConnectToAccess(String connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public List<String> GetData(String sql) 
    { 
     var data = new List<String>(); 
     using (var connection = new OleDbConnection(_connectionString)) 
     { 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = sql; 
       command.CommandType = CommandType.Text; 
       connection.Open(); 
       using (var reader = command.ExecuteReader()) 
       { 
        if (reader != null && reader.HasRows) 
        while (reader.Read()) 
        { 
         data.Add(reader["First Name"] + " " + reader["Last Name"]); 
        } 
       } 
      } 
     } 
     return data; 
    } 
} 

이 코드는 작동하며 데이터베이스에서 데이터를 성공적으로 가져옵니다. 그러나 GetData() 메서드를 향상시켜보다 동적으로 만들고 싶습니다. 어떻게 든 익명 객체의 목록을 반환하고 싶습니다. 각 객체는 반환 된 데이터 세트의 열과 관련된 속성을 갖습니다.

나는 닷넷을 잠시 코딩 해왔다. 그러나 나는 많은 개념에서 여전히 새로운 편이다. 데이터 집합의 열을 가장 효과적으로 미러링하는 익명 개체 목록을 만드는 방법을 잘 모르겠습니다. 나는 또한이 경우에 어떤 리턴 타입을 사용할 지 모르겠다. 어쩌면 List라고 생각하고있다. 그런 다음 리플렉션을 사용하여 익명의 개체에서 데이터를 가져 와서 필요한 곳으로 전송해야 할 필요가 있다고 생각합니다.

누군가가이 퍼즐의 중요한 부분을 도울 수 있다면, 나는 가장 의무감을 느낍니다.

+0

왜 바퀴를 재발견. Entity Framework 또는 다른 ORM을 사용하십시오. –

+0

@JohnSaunders OP는 그가 Access를 사용하고 있다고 말했습니다. EF는 Access를 지원하지 않으며 매핑을 수행하기 위해 ORM을 던지는 것은 잔인합니다. – Asti

답변

4

반환 유형으로 익명 형식을 사용할 수 없습니다. 왜 DataTable을 반환하지 않는 것이 좋을까요? DataAdapter를 사용하여 프로세스를 훨씬 쉽게 만들 수도 있습니다. 그것은 또한 당신에게 스키마를 가져옵니다.

당신이 모든 것을 객체를 얻기 주장하는 경우 :

public IEnumerable<T> GetData(String sql, Func<DataReader, T> selector) 
{ 
    //code elided 

    while (reader.Read()) 
    { 
     yield return selector(reader); 
    }  
} 

는 이제 선택기로 사용할 수 있습니다 :

var people = GetData("Select * from People", reader => new Person { Name = reader{"Name"], Age = reader["Age"] }) 
people.Take(5); //first five records only 
관련 문제