2012-07-31 2 views
0

MySQL 쿼리, 특히 데이터 판독기의 결과를 캐시 할 수있는 방법이 있습니까?캐시 mysql 결과 #

응용 프로그램이로드 될 때 한 번만 수행해야하는 평범한 쿼리가 있고 각 폼은 원격 서버를 쿼리하는 대신 캐시 값을 사용할 수 있습니다. 현재

내 방법은 내가 코드에서 어디 그런 다음 나중에 (아래 예)

if (parentfrm.prioritylist != null) 
     { 
      if (parentfrm.prioritylist.HasRows) 
      { 
       using (var rows = parentfrm.prioritylist) 
       { 
        while (rows.Read()) 
        { 
         cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
         cb.Items.Add(cbi); 
        } 
       } 
      } 
      else 
      { 
       query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
       parentfrm.prioritylist = db.localfetchrows(query); 
       if (cb != null) 
       { 
        using (var rows = db.localfetchrows(query)) 
        { 
         while (rows.Read()) 
         { 
          cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
          cb.Items.Add(cbi); 
         } 
        } 
       } 
      } 
     } 
     else 
     { 
      query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
      parentfrm.prioritylist = db.localfetchrows(query); 
      if (cb != null) 
      { 
       using (var rows = db.localfetchrows(query)) 
       { 
        while (rows.Read()) 
        { 
         cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
         cb.Items.Add(cbi); 
        } 
       } 
      } 
     } 
+0

winform? asp.net? mvc? wtf? wpf? wcf? –

+0

내 사과 내가 태그를했다고 생각, winform – Neo

답변

1
public class Priority{ 
    public int PriorityId {get;set;} 
    public string Label {get;set;} 
} 

public class CachedItems { 
    private static List<Priority> _priorityList=new List<Priority>(); 

    public static List<Priority> GetPriorityList() { 
     if (_priorityList==null){ 
      // Load DB Items to the _priorityList, 
      // if the app is multithreaded, you might wanna add some locks here 
     } 
    } 
} 

그것을 검색 할 수 있도록 데이터를 검색하고 다른 MySqlDataReader에 저장합니다 MySqlDataReader을 사용하는 것입니다 CachedItems.GetPriorityList()을 사용하여 캐시 된 목록에 액세스하십시오.

+0

그래서 귀하의 솔루션은 개체로 데이터 렌더링을 변환하고 목록에있는 개체를 저장하는 것입니다.데이터의 일부가 20 개의 열로 구성되어 있기 때문에 코드를 정의하지 않고 datareader의 데이터를 객체로 변환하는 더 쉬운 방법이 있습니까? ( – Neo

+1

'Dictionary ' 'List '대신에'List '을 사용하는 것이 좋습니다.하지만 항상 값을 캐스팅해야합니다. 장기적으로 스티브 비와 같이 할 것을 제안합니다. –

1

짧은 답변 : 개체를 채우는하고

긴 대답을 재사용 :는 디커플링의 어떤 종류를 사용하도록 응용 프로그램을 설계. 가장 간단한 방법은 이중 DataSet/DataAdapter 클래스와 일부 데이터 바인딩을 사용하는 것입니다.

코드가 읽기 쉽고 (쓰고) 더 쉬울뿐만 아니라 필요한 경우에만 요청을 실행하는 것과 같은 유연성이 훨씬 뛰어납니다.

  • 데이터 추상화 계층 (DAL)을 그 데이터 집합 (또는 사용자 정의 클래스)를 반환하는 DB 작업을 마무리, 변경 (데이터 집합이 내장 변경 내용 추적 기능이 있습니다)
  • 저장 :

    전통적인 접근 방법은 만드는 것입니다

  • 로직을 캡슐화하는 비즈니스 로직 계층 (BLL). Bll은 응용 프로그램 자체가 포함 된 DALs
  • UI 계층에서 작동 할 수 있습니다. Ui는 BLL의 메소드를 호출해야합니다. 이 기사를 읽어

시작 : http://www.codeproject.com/Articles/36847/Three-Layer-Architecture-in-C-NET

0

당신은 작은 응용 프로그램 툴킷 클래스, PriorityCheckboxes을 고려하고, 싱글 만들 수 있습니다. 그런 다음 해당 확인란 값이 필요할 때 PriorityCheckboxes에서 GetInstance() 메서드의 첫 번째 참조가로드되어야합니다. 이 상태로 경쟁 조건이있는 경우로드 논리는 정적 초기화 프로그램에 포함될 수 있습니다.

public class PriorityCheckboxes { 
    private static CheckBox _CBItems = null; 

    private static PriorityCheckboxes _instance - null; 

    public CheckBox CheckBoxes { 
     get() { return _CBItems; } 
    } 

    private PriorytyCheckboxes() { 
     this.LoadCBItems(); 
     _instance = new PriorityCheckboxes(); 
    } 

    public static PriorityCheckboxes GetInstance() { 
     if(_instance == null) _instance = new PriorityCheckboxes(); 
     return _instance; 
    } 
    private void LoadCBItems() { } 
} 
1

빠른 방법은 이미 사용 (Mennans 코드에 약간의 건물)

public class CachedItems 
    { 
     private static List<dynamic> _priorityList = new List<dynamic>(); 

     public static List<dynamic> GetPriorityList() 
     { 
      if (_priorityList == null) 
      { 
       // Load DB Items to the _priorityList, 
       // if the app is multithreaded, you might wanna add some locks here 

       query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
       parentfrm.prioritylist = db.localfetchrows(query); 
       if (cb != null) 
       { 
        using (var rows = db.localfetchrows(query)) 
        { 
         while (rows.Read()) 
         { 
          _priorityList.Add(new { 
               PriorityId = int.Parse(rows["priorityid"].ToString()), 
               Label = rows["label"].ToString() 
               }); 
         } 
        } 
       } 

      } 

      return _priorityList; 
     } 
    } 

를하고있는 일에 파에 동적 형/익명 클래스 (.NET 4)를 사용하는 것입니다 캐시 값 :

 foreach (var item in CachedItems.GetPriorityList()) 
     { 
      if (item.Priority == 1) 
      { 

      } 
     } 

뭘하지 않는 것은 item.Priority 즉 안전 유형은 우선 순위가 값 또는 INT 아닌 값을 포함하지 않는 경우 오류를 런타임 원인이 migth, 당신은해야합니다 이것을 덮다 캐시를로드 할 때 기본적으로 현재 데이터 아더와 함께있는 상황입니다.