2013-12-11 4 views
0

가능한 한 일반적으로 (DB 테이블을 생성하고 채우는) 함수를 작성하려고합니다.커스텀 클래스를 객체로 변환하기

제 문제는 다른 클래스에서 사용하고 싶습니다. 문제는 매우 일반적인이 순서대로 사용자 지정 클래스 데이터를 개체 목록으로 함수에 전달한 다음 다시 변환해야한다는 것입니다. 여기

내가 무엇을 가지고 :

public static void appenddatatotableRef(string connectionstring, string tablename, List<Object> values, string objecttype) 
    { 
     var properties = new List<System.Reflection.FieldInfo>(); 

     if (objecttype == "PowerResults") 
     { 
      var data = values.OfType<PowRes>().ToList(); 
      properties = typeof(PowRes).GetFields(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name).ToList(); 
     } 

     string columnam = "[" + properties[0].Name + "]"; 
     string valstring = "@" + properties[0].Name; 

     for (int i = 1; i < properties.Count; i++) 
     { 
      columnam = columnam + ", [" + properties[i].Name + "]"; 
      valstring = valstring + ", @" + properties[i].Name; 
     } 


     string commandtext = "INSERT INTO [" + tablename + "](" + columnam + ")" + "VALUES(" + valstring + ")"; 

     using (var myconn = new OleDbConnection(connectionstring)) 
     { 
      myconn.Open(); 
      using (var cmd = new OleDbCommand()) 
      { 

       foreach (var item in values) 
       { 
        cmd.CommandText = commandtext; 
        cmd.Parameters.Clear(); 
        for (int i = 1; i < properties.Count; i++) 
        { 
         try 
         { 
          cmd.Parameters.AddWithValue("@" + properties[i].Name, properties[i].GetValue(item)); 
         } 
         catch 
         { 

         } 
        } 

        cmd.Connection = myconn; 
        cmd.ExecuteNonQuery(); 

       } 
      } 
      myconn.Close(); 
     } 

    } 

내가 List<PowerRes>에 입력을 변경하고 데이터 값에서 변환을 제거하면이 잘 작동하지만 그것은 더 이상 일반적인 없습니다.

어떻게 든 일반적인 방식으로 만들 수 있습니까?

실무 솔루션 (올바른 방향으로 나를 가리켜 주셔서 감사합니다)! 수행 할 수 있습니다

public static void AppendToTable<T>(..., IEnumerable<T> items, ...) { 
    var properties = typeof(T).GetFields(); 
+0

공개 회원 이름은 UpperCamelCase 여야합니다. – SLaks

+0

BTW <이 작업을 수행하는 코드를 깔끔하게 작성했습니다. https://github.com/SLaks/ExcelExporter/blob/master/ExcelExporter/Exporters/SheetBase.cs#L26-L62 및 https://github.com/SLaks/ExcelExporter/blob/master/ExcelExporter/Exporters/TypedSheet를 참조하십시오. .cs – SLaks

답변

2

당신은 일반적인 기능을 확인해야합니다. "MicroORM"이라고하는 기존의 오픈 소스 라이브러리 중 일부는이를 매우 잘 처리 할 수 ​​있습니다.

예를 들어 PetaPoco을 살펴보십시오.

+0

감사합니다. 정교하게 제발 주시겠습니까? – nik

+0

당신은 무엇을 이해하지 못합니까? – SLaks

+0

그래서 수업 목록을 "항목"으로 전달하면 더 이상 유형에 신경 쓰지 않겠습니까? – nik

1

:

public static void appenddatatotableRef<T>(string connectionstring, string tablename, IEnumerable<T> values) 
    { 

     var properties = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name).ToList(); 

     //setting up the command text for insert into 
     string columnam = "[" + properties[0].Name + "]"; 
     string valstring = "@" + properties[0].Name; 
     for (int i = 1; i < properties.Count; i++) 
     { 
      columnam = columnam + ", [" + properties[i].Name + "]"; 
      valstring = valstring + ", @" + properties[i].Name; 
     } 
     string commandtext = "INSERT INTO [" + tablename + "](" + columnam + ")" + "VALUES(" + valstring + ")"; 


     using (var myconn = new OleDbConnection(connectionstring)) 
     { 
      myconn.Open(); 
      using (var cmd = new OleDbCommand()) 
      { 

       foreach (var item in values) 
       { 
        cmd.CommandText = commandtext; 
        cmd.Parameters.Clear(); 
        for (int i = 0; i < properties.Count; i++) 
        { 
          cmd.Parameters.AddWithValue("@" + properties[i].Name, properties[i].GetValue(item) ?? ""); 
        } 

        cmd.Connection = myconn; 
        cmd.ExecuteNonQuery(); 

       } 
      } 
      myconn.Close(); 
     } 

    } 
+0

감사합니다. 이 일을 끝내는 문제를 해결하지만 내 이해에 도움이되지 않으며 나는 여전히 학습자이며 향상시키고 자합니다 ...하지만 감사합니다 – nik

+0

좋아하는 도서관을 공유하는 것이 기쁩니다. 게시 한 코드에 따르면, 당신은 확실히 올바른 길을 가고 있습니다. 누락 된 링크는 SLasks 응답 및 .NET 일반 사용에 있습니다. Generics가 작동하는 방법을 이해하는 가장 좋은 방법은 예를 들어 SLaks가 주석으로 게시 된 링크에서 일부 코드를 연구하는 것입니다. – Larry

관련 문제