2011-05-09 5 views
1

내가 LINQ 매우 새로운 오전과 같은 수행하는 방법을 알아 내려고 노력하고 있어요 :LINQ 반사 윈폼

는 현재, 나는 그것의 멤버 중 하나로서 DataRow를 가진 자료 양식이있는 윈폼 프로젝트가 있습니다. 필자는 DataTable (SQL Query Result)의 데이터를 기반으로 DataRow를 채 웁니다. 파생 된 Forms에는 데이터의 값으로 채워지는 컨트롤이 있습니다. 파생 된 폼의 저장 단추를 클릭하면 기본 폼의 DataRow가 업데이트 된 다음 파생 된 폼이 DataAdapter를 통해 데이터베이스를 업데이트합니다.

내가 파생 양식에 내 LINQ 쿼리를 생성하고 자료의 Object로 결과를 할당 :

나는 내가 다음으로 LINQ를 사용하여이 기능을 구현하는 시도 linqs를 사용하여 SQL 명령을 모두 교체하고 싶어 형태. Base Form의 Object를 Linq 쿼리의 클래스 유형으로 캐스팅하고 리플렉션을 사용하여 파생 된 양식의 모든 컨트롤을 채 웁니다. 저장 버튼을 클릭하면 개체가 업데이트되지만 데이터베이스를 업데이트 할 수 없습니다.

해결할 수없는 문제는 개체를 업데이트 한 후에 데이터베이스를 업데이트하는 방법입니다. 이 시점에서 나는 linq 쿼리에 사용 된 데이터 컨텍스트가 없습니다.

linq 쿼리에서 SQL 함수를 사용하므로 익명 형식 오류가 발생하면서이 값에 대해 별도의 클래스를 만들어야했습니다. 아마도 여기에 뭔가 빠져있을 것입니다.

나는 정말 linq 코드가 얼마나 깨끗한 지 알고 싶습니다. (토마스의 대답에 브래드의 편집에서 복사)

편집 : 여기

내 코드의 3 단계입니다.

1 단계은 - 데이터베이스

private void GetDatabaseDetailData() 
{ 
_db = new PriorityDataContext(); 

DetailData = (from db in _db.tblDatabases 
       where db.DatabaseID == Id 
       select db).SingleOrDefault(); 



DeveloperData = (from db in _db.tblDatabases 
       where db.DatabaseID == Id 
       select new DeveloperInfo 
       { 
        DeveloperName = _db.func_get_employee_name(db.Developer) 
       }).SingleOrDefault(); 

} 

2 단계에서 데이터의 그을음 레코드를 가져 - 이름이 객체에 존재 whos는 모든 컨트롤을 채 웁니다. DetailData 오브젝트는,이 메소드에게 건네진 특정의 형태에 캐스트됩니다. 간결함을 위해 모든 코드가 표시되지 않았습니다.

protected virtual void PopulateDetailControlsA(List<Control> controlContainers, string srcDataTableName) 
    { 
     Object data = null; 
     Type type = null; 
     switch (srcDataTableName) 
     { 
      case "tblDatabases" : 
       type = typeof(tblDatabase); 
       data = (tblDatabase)DetailData; 
       break; 
     } 

     if (type != null) 
     { 
      var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

      foreach (var controlContainer in controlContainers) 
      { 
       foreach (var propertyInfo in properties) 
       { 
        if (!ControlExists(controlContainer, propertyInfo.Name)) continue; 

        var txtControl = controlContainer.Controls[propertyInfo.Name] as ExtendedTextBox; 
        if (txtControl != null) 
        { 
         try 
         { 
          var value = propertyInfo.GetValue(data, null).ToString(); 

          if (propertyInfo.Name == "row_oper_name" || propertyInfo.Name == "row_last_chng_oper_name") 
          { 
           txtControl.Text = RowOperatorData.RowOperatorName; 
           txtControl.ValueMember = propertyInfo.GetValue(data, null).ToString(); 
          } 
          else 
           txtControl.Text = value; 
         } 
         catch (NullReferenceException) 
         { 
         } 
         continue;........... 

3 단계 - 시도하고에서 파생 다시 데이터베이스에 변경 사항을 저장합니다. 내가 듣고 정말 불분명하고있는 무슨

private void SaveData() 
{ 
      try 
     { 
      _db.SubmitChanges(); 
     } 
     catch (Exception sqlException) 
     { 

     } 
} 

내가 여러 쿼리에 동일한 코드를 사용할 수 있도록 기본 양식에서 설정 한 결과를 저장하는 방법입니다. DataRow는 25 개 이상의 Forms에 대해 일부 코드를 사용했기 때문에 효과적이었습니다.

+0

LINQtoSQL을 사용하지 않는 이유는 무엇입니까? 여기에는 이미 모든 유용한 메소드가 있습니다. DataContext에서 SubmitChanges()를 호출 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx – Bazzz

+0

예, LinqtoSQL을 사용하고 있으며 모든 기능이 정상적으로 작동합니다. 내 문제는이 시점에서 쿼리 결과를 가져 오는 데 사용 된 원래 DataContext가 없기 때문에 기본 폼의 데이터베이스에서 데이터베이스를 업데이트하는 방법을 모르겠다는 것입니다. 파생 된 폼의 멤버로 DataContext를 넣으려고했지만 작동하지 않습니다. – Brad

+0

귀하의 질문에 대한 Tomas의 답변을 편집했습니다. – Brian

답변

0

올바르게 이해하면 파생 형식으로 DataContext을 만든 다음 파생 형식으로 쿼리를 작성하는 데 사용합니다. 데이터베이스를 업데이트 할 수 있으려면 쿼리가 테이블에서 얻은 엔티티를 반환해야합니다 (즉, select 절은 엔티티를 반환해야 함). 예를 들면 : 당신이 다음 엔티티를 수정하는 경우

DataContext db = // ... 
var q = from p in db.Things 
     where p.Some > 10 select p; 

, 당신은 데이터베이스 (엔티티 객체로 만든) 변경 사항을 저장하기 위해 db.SubmitChanges()을 사용할 수 있습니다. 이를 위해 원래 db 값이 필요합니다.

시나리오에서는 DataContext (필드로)을 파생 된 형식으로 저장해야합니다. 기본 폼에서 업데이트를 수행해야하는 경우 가상 메서드를 정의하는 것이 좋습니다.

// Base form 
protected abstract void UpdateDatabase(); 

// Derived from with field 'db' storing 'DataContext' 
protected override void UpdateDatabase() { 
    db.SumbitChanges(); 
} 
+0

@ 브래드 :이 답변이 아니라 질문을 편집해야합니다. – SLaks