So erstellen Sie eine Klasse automatisch aus datatable

  • Ich weiß, dass es einen saubereren Weg gibt, als ich bin. Grundsätzlich rufe ich eine Datentabelle aus meiner SQL-Datenbank ab. Ich möchte diese Informationen jetzt in einer Klasse haben, die global zugänglich ist. Ich möchte nicht durch jede Spalte wie folgt gehen: txtFirstName.Text = dt [0] .ToString (). Ich möchte eine "User" -Klasse erstellen und txtFirstName.Text = User.FirstName zuweisen. ABER ich möchte dt [0] nicht manuell zu FirstName und dt [1] zu LastName zuordnen ... Ich möchte, dass das Objekt automatisch erstellt wird! Zumindest wenn die Klasse erstellt wurde und die Elemente mit den Namen der dt-Spalten übereinstimmen, sollte die Zuordnung automatisch erfolgen.

    Vielen Dank!

    22 November 2011
    user948060
5 answers
  • Warum verwenden Sie Linq nicht für SQL? Ich mag es sehr.

    Wenn Sie Ihre Tabellen herausgezogen haben, können Sie in diesem Fall eine separate .cs-Klassendatei für einzelne Tabellen erstellen. BEARBEITEN SIE DEN GENERIERTEN CODE NICHT :) Wenn Sie Ihre dbml-Datei in "App_Code / Linq_customer /" Ordner gespeichert und eine Tabelle mit dem Namen "Customer" zugeordnet haben, kann Ihre Klasse folgendermaßen aussehen (ungeprüfter Code):

     using System.Linq;
    
    namespace Linq_customer
    {
        public partial class Customer
        {
            public static Customer GetCustomerByID(int customerID, CustomerDataContext dc)
            {
    
                return (from s0 in dc.Customers
                       where s0.customerID== customerID
                       select s0).firstOrDefault();
            }
        }
    }
     

    Dann machen Sie auf Ihrer Seite oder einer anderen Klasse Folgendes:

     using Linq_customer;
    ...
    CustomerDataContext dc = new CustomerDataContext() //(Generated data context)
    Customer myCustomerDude = Customer.GetCustomerByID(5, dc);
    if(myCustomerDude == null) return error..
    txtFirstName.Text = myCustomerDude.firstName;
     

    Optional, wenn Sie einen neuen Benutzer erstellen möchten:

     myCustomerDude = new Customer();
     

    Auch das Speichern neuer Informationen ist recht einfach:

    ...

     myCustomerDude.City = txtCity.Text;
    myCustomerDude.favoriteSlogan = "I believe in Science";
    dc.Customers.insertOnSubmit(myCustomerDude); //If not already existing, if is already in table then omit this line.
    dc.submitChanges();
     
    22 November 2011
    ToddBFisher
  • Sie fragen grundsätzlich nach einem ORM (objektrelationales Mapping). . Zwei von ihnen, die mit .NET geliefert werden, sind LINQ to SQL und < a href = "http://msdn.microsoft.com/de-de/library/bb399572.aspx" rel = "nofollow"> Entity Framework . Es gibt auch andere, wie NHibernate . Das Thema ist ziemlich kompliziert, daher möchten Sie vielleicht alle Ihre Optionen untersuchen und auswählen, welche in Ihrem Szenario am besten funktionieren würde.

    21 November 2015
    Jacob
  • Rollen Sie nicht selbst. Es ist viel zu viel Arbeit. Verwenden Sie LINQ-to-SQL. Das Befehlszeilentool sqlmetal konvertiert ein vorhandenes Schema in eine C # -Datei, die Sie direkt in LINQ-Abfragen verwenden können. Ich tat genau das für unsere FogBugz-Datenbank, als diese Frage auftauchte:

     sqlmetal /server:<our-server> /database:fogbugz /views /functions /sprocs /code:fogbugz.cs
     
    22 November 2011
    Marcelo Cantos
  • Sie können Reflection wie folgt verwenden: Es tut mir leid, dass die Kommentare Chinaese sind. Sie können Folgendes aufrufen: ConvertDataRowToModel(User object,dt,0);

         #region 根据反射机制将dataTable中指定行的数据赋给obj对象
        /// <summary>
        /// 根据反射机制将dataTable中指定行的数据赋给obj对象
        /// </summary>
        /// <param name="obj">obj对象</param>
        /// <param name="dataTable">dataTable</param>
        /// <param name="rowIndex">指定行</param>
        public static void ConvertDataRowToModel(object obj, DataTable dataTable, int rowIndex)
        {
            //指定行不存在
            if (dataTable.Rows.Count < (rowIndex + 1))
            {
                throw new Exception("指定行不存在!");
            }
    
            //DataTable列为空!
            if (dataTable.Columns.Count < 1)
            {
                throw new Exception("DataTable列为空!");
            }
    
            Type type = obj.GetType();
            PropertyInfo[] pInfos = type.GetProperties();
    
            try
            {
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    for (int j = 0; j < pInfos.Length; j++)
                    {
                        //全部转换为小写的作用是防止数据库列名的大小写和属性的大小写不一致
                        if (dataTable.Columns[i].ColumnName.ToLower() == pInfos[j].Name.ToLower())
                        {
                            PropertyInfo pInfo = type.GetProperty(pInfos[j].Name);  //obj某一属性对象
    
                            object colValue = dataTable.Rows[rowIndex][i]; //DataTable 列值
    
                            #region 将列值赋给object属性
                            if (!Comm_Object.ObjectIsNull(colValue))
                            {
                                if (pInfos[j].PropertyType.FullName == "System.String")
                                {
                                    pInfo.SetValue(obj, Convert.ToString(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Int32")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Int64")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Single")
                                {
                                    pInfo.SetValue(obj, Convert.ToSingle(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Double")
                                {
                                    pInfo.SetValue(obj, Convert.ToDouble(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Decimal")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Char")
                                {
                                    pInfo.SetValue(obj, Convert.ToChar(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Boolean")
                                {
                                    pInfo.SetValue(obj, Convert.ToBoolean(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.DateTime")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                //可空类型
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else
                                {
                                    throw new Exception("属性包含不支持的数据类型!");
                                }
                            }
                            else
                            {
                                pInfo.SetValue(obj, null, null);
                            }
                 #endregion 
     
     break; 
    } 
    } 
    } 
    } 
     catch (Ausnahme ex) 
     {
     werfen ex; 
     } 
    } 
     #endregion 
      
    22 November 2011
    animusonSSEMember
  • Sie können ein ORM verwenden, mit dem Ihre Datenbanktabellen Objekten zugeordnet werden. Andere Optionen umfassen:

    1. Erstellen Sie eine T4-Vorlage zum Lesen aus der Datenbank und erstellen Sie Ihre Objekte mit "Mapping" -Code. ( http://msdn.microsoft.com/de-de/library/bb126445). aspx )
    2. Erstellen Sie die Klassen, und verwenden Sie AutoMapper, um den IDataReader Ihrem Objekt zuzuordnen.
    22 November 2011
    Simon