2017-09-03 5 views
2

どのようにクラスの挿入を動的に設定しますか?List内のクラスの各列をどのようにループするのですか<class>それぞれをCで使用します。

どのように私はクラスの各列をforeachループで設定するのですか? リスト<のIEmployeeまたはCustomクラスの各列を、foreachループのstring []の値とペアにする方法はありますか?

私は、カスタムクラスをデータベースに動的にforeachループを使用して挿入しようとしています。 forループを使用せずに。

ループ以下 のために使用せずに、動的にカスタムクラスを挿入する方法があればコードです:私は何をしたいか

public class Employee : IEmployee 
{ 
    private string _fname; 
    public string Firstname 
    { 
     get { return _fname; } 
     set { _fname = value; } 
    } 

    private string _lname; 
    public string Lastname 
    { 
     get { return _lname; } 
     set { _lname = value; } 
    } 

    private int _age; 

    public int Age 
    { 
     get { return _age; } 
     set { _age = value; } 
    } 

    private Gender _sex; 
    public Gender Sex 
    { 
     get { return _sex; } 
     set { _sex = value; } 
    } 

    private string _position; 
    public string Position 
    { 
     get { return _position; } 
     set { _position = value; } 
    } 

    private DateTime _bday; 
    public DateTime BirthDay 
    { 
     get { return _bday; } 
     set { _bday = value; } 
    } 
} 


string[] empcoltest = 
    { 
     "userid", 
     "fname", 
     "mname", 
     "lname", 
     "gender", 
     "position", 
     "birthday" 

    }; 




public void function(List<IEmployee> EmpList) 
{ 
    string[] columns, values; 
     columns = empcoltest; 
     values = new string[columns.Length]; 
     for (int a = 0; a < columns.Length; a++) 
     { 
      columns[a] = columns[a].Trim(); 
      values[a] = "@col" + a.ToString(); 
     } 
    string strEmp2 = @"INSERT INTO tblEmployees(" + string.Join(", ", columns) + ") VALUES(" + string.Join(", ", values) + ")"; 


    using (SqlCommand cmd = new SqlCommand(strEmp2, sqlDB.SqlDB)) 
    { 
    sqlDB.connect(); 


    foreach (string t in values) 
    { 
     foreach (IEmployee Emp in) 
     { 
      cmd.Parameters.AddWithValue(t,Emp); 
     } 
    } 

    } 

} 

は試してみてください。この

foreach (string t in values) 
{ 
    foreach (IEmployee Emp in) 
    { 
    //how do i set the Emp dynamically 
    cmd.Parameters.AddWithValue(t,Emp); 

    } 
    } 

答えて

0

のようなものですあなたのコードを投稿するときにもっと詳細を提供するために、コードをまとめて置くだけではいけません。 リフレクションを使用してクラスをループしたり、値を設定したり、値を取得したり、プロパティの名前などを取得することができます。 これに勧める反射についてのチュートリアルhttps://www.youtube.com/watch?v=y8-uq6Ur7Dc

私は説明するために、コンソールアプリで簡単な例を作ってきました。ここ

は、Employeeクラス

class Employee 
{ 
    public int FirstProp{ get; set; } 
    public string SecondProp { get; set; } 
} 

反射法

public static void EmployeeReflection(List<Employee> EmpList) 
    { 
     PropertyInfo[] pInfo = typeof(Employee).GetProperties(); 
     //or 
     // PropertyInfo[] pinfo = EmpList.GetType().GetProperties(); 
     for (int i= 0; i < EmpList.Count; i++) 
      { 
       string name = pInfo[i].Name; 
       object value = pInfo[i].GetValue(EmpList[i]); 
       Console.WriteLine("property name: " + name); 
       Console.WriteLine("property value: " + value); 
       Console.WriteLine(".........."); 

      } 

      /* or using foreach 
     int count = 0; 
     foreach (Employee emp in EmpList) 
     { 
      string name = pInfo[count].Name; 
      object value = pInfo[count].GetValue(emp); 
      Console.WriteLine("property name: " + name); 
      Console.WriteLine("property value: " + value); 
      Console.WriteLine(".........."); 
      count++; 
     } 
     */ 

    } 

とメソッドを呼び出すことである

 static void Main(string[] args) 
    { 

     List<Employee> listOfEmploies = new List<Employee> 
     { 
      new Employee { FirstProp = 1, SecondProp = "SomeText01" }, 
      new Employee { FirstProp = 2, SecondProp = "SomeText02" } 
     }; 
     EmployeeReflection(listOfEmploies); 

     Console.ReadLine(); 
    } 

using System.Reflectionも必要です。

*私が大学院の仕事のためにアプリケーションを作成していたときに作成した選択、挿入、更新、削除のクエリを作成するクラスを共有しましょう。

呼び出し条件は、クラスがSQLテーブルと同じ名前を持ち、クラスのプロパティがSQLテーブルのカラムと同じにインデックス付けされていることです。このクラスを呼び出す場合、コンストラクタはここSqlConnectionオブジェクトOBJ *

をtaksesたとえば、私のクラスである

class SqlHelper<T> where T : new() 
{ 
    private PropertyInfo[] pInfo = typeof(T).GetProperties(); 
    private string sqlTable = typeof(T).Name; //i've made this filed becouse i've named my classes same as tables in SQL 
    public SqlConnection Con { get; set; } 
    private StringBuilder sb = new StringBuilder(); 
    private List<string> columns = new List<string>(); 
    public SqlHelper(SqlConnection con) 
    { 
     this.Con = con; 
    } 

    private void GetNames() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM " + sqlTable, Con); 
     try 
     { 
      Con.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 
      for (int i = 0; i < dr.FieldCount; i++) 
      { 
       if (!columns.Contains(dr.GetName(i))) 
        columns.Add(dr.GetName(i)); 
      } 
     } 
     catch (Exception) 
     { 
      return; 
     } 
     finally 
     { 
      Con.Close(); 
     } 
    } 
    public List<T> ReturnSelect() 
    { 
     List<T> listGen = new List<T>(); 
     SqlCommand cmd = new SqlCommand("SELECT * FROM " + sqlTable, Con); 
     try 
     { 
      Con.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       T obj = new T(); 
       for (int i = 0; i < dr.FieldCount; i++) 
       { 
        if (!Convert.IsDBNull(dr[i])) 
         pInfo[i].SetValue(obj, dr.GetValue(i)); 

       } 
       listGen.Add(obj); 

      } 

      return listGen; 
     } 
     catch (Exception) 
     {   
      return null; 
     } 
     finally { Con.Close(); } 
    } 

    public bool InsertInto(T obj) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = Con; 
     sb.Clear(); 
     sb.Append("INSERT INTO " + sqlTable + " VALUES("); 
     if (columns.Count == 0) 
      GetNames(); 
     string s1 = ","; 
     for (int i = 1; i < columns.Count; i++) 
     { 
      if (columns.Count - 1 == i) 
       s1 = ")"; 
      sb.Append("@" + pInfo[i].Name + s1); 
      cmd.Parameters.AddWithValue("@" + pInfo[i].Name, pInfo[i].GetValue(obj)); 

     } 

     cmd.CommandText = sb.ToString(); 

     try 
     { 
      Con.Open(); 
      cmd.ExecuteNonQuery(); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 
      Con.Close(); 
     } 
    } 
    public bool Update(T obj) 
    { 
     sb.Clear(); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = Con; 
     sb.Append("UPDATE " + sqlTable + " SET "); 
     string s1 = ","; 
     if (columns.Count == 0) 
      GetNames(); 
     for (int i = 1; i < columns.Count; i++) 
     { 
      if (columns.Count - 1 == i) 
       s1 = ""; 
      sb.Append(columns[i] + "=" + "@" + pInfo[i].Name + s1); 

      cmd.Parameters.AddWithValue("@" + pInfo[i].Name, pInfo[i].GetValue(obj)); 
     } 
     sb.Append(" WHERE " + columns[0] + "=" + "@" + pInfo[0].Name + ";"); 
     cmd.Parameters.AddWithValue("@" + pInfo[0].Name, pInfo[0].GetValue(obj)); 

     cmd.CommandText = sb.ToString(); 

     try 
     { 
      Con.Open(); 
      cmd.ExecuteNonQuery(); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 
      Con.Close(); 
     } 

    } 
    public bool Delete(T obj) 
    { 
     if (columns.Count == 0) 
      GetNames(); 
     string id = $"@{pInfo[0].Name}"; 
     SqlCommand cmd = new SqlCommand("DELETE FROM " + sqlTable + " WHERE " + columns[0] + "=" + id, Con); 
     cmd.Parameters.AddWithValue(id, pInfo[0].GetValue(obj)); 
     try 
     { 
      Con.Open(); 
      cmd.ExecuteNonQuery(); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 
      Con.Close(); 
     } 

    } 
} 

これは、それがどのように動作するかです:

SqlHelper<Employee> hlp = new SqlHelper<Employee>(new SqlConnection 
      (new SqlConnectionStringBuilder 
      { 
       DataSource = @"(local)\SQLEXPRESS", 
       InitialCatalog = "SomeDatabase", 
       IntegratedSecurity = true 
      }.ToString())); 

     Employee e = new Employee { FirstProp = 3, SecondProp = "SomeText3" }; 
     List<Employee> list = hlp.ReturnSelect(); 
     bool Insertresult= hlp.InsertInto(e); 
     bool Updateresult=hlp.Update(e); 
     bool Deleteresult=hlp.Delete(e); 

・ホープ、このことができます。

関連する問題