Как создать класс автоматически из Datatable - PullRequest
3 голосов
/ 22 ноября 2011

Я знаю, что есть более чистый способ сделать это, чем я.По сути, я получаю данные из моей базы данных SQL.Теперь я хочу, чтобы эта информация была доступна в глобальном классе.Я не хочу проходить через каждый столбец следующим образом: txtFirstName.Text = dt [0] .ToString ().Я хочу создать класс «Пользователь» и назначить txtFirstName.Text = User.FirstName.НО, я не хочу вручную отображать dt [0] в FirstName, а dt [1] в LastName ... Я хочу, чтобы объект создавался автоматически!Или, по крайней мере, после того, как класс создан, и элементы соответствуют именам столбцов dt, сопоставление должно произойти автоматически.

Ответы [ 5 ]

4 голосов
/ 22 ноября 2011

Почему бы не использовать Linq to SQL?Мне это очень нравится.

Как только вы вытягиваете свои таблицы, в этом случае вы можете создать отдельный частичный файл класса .cs для отдельных таблиц.НЕ РЕДАКТИРУЙТЕ ОБЪЕДИНЕННЫЙ КОД :) Если вы сохранили свой dbml-файл, скажем, в папке «App_Code / Linq_customer /» и сопоставили таблицу с именем «Customer», ваш класс может выглядеть так (непроверенный код):

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();
        }
    }
}

Затем со своей страницы или другого класса сделайте что-то вроде:

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;

По желанию, если вы хотите создать нового пользователя:

myCustomerDude = new Customer();

И сохранение любой новой информации довольнолегко тоже:

...

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();
3 голосов
/ 22 ноября 2011

Вы в основном запрашиваете ORM (объектно-реляционное отображение).Два из них, поставляемые с .NET: LINQ to SQL и Entity Framework .Существуют и другие, такие как NHibernate .Тема довольно сложная, поэтому вы можете изучить все возможные варианты и выбрать наиболее подходящие для вашего сценария.

2 голосов
/ 22 ноября 2011

Не катайся сам.Это слишком много работы.Используйте LINQ-to-SQL.Инструмент командной строки sqlmetal преобразует существующую схему в файл C #, который можно использовать непосредственно в запросах LINQ.На самом деле, я делал именно это для нашей базы данных FogBugz, когда возник этот вопрос:

sqlmetal /server:<our-server> /database:fogbugz /views /functions /sprocs /code:fogbugz.cs
0 голосов
/ 22 ноября 2011

вы можете использовать рефлексию, вот так: извините, комментарии - это китаец, вы можете ссылаться так: 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 (Exception ex)
        {
            throw ex;
        }
    }
    #endregion
0 голосов
/ 22 ноября 2011

Вы можете использовать ORM, который отобразит ваши таблицы базы данных на объекты.Другие варианты включают

  1. Создание шаблона T4 для чтения из базы данных и создания ваших объектов с помощью кода «отображения».(http://msdn.microsoft.com/en-us/library/bb126445.aspx)
  2. Создайте классы и используйте AutoMapper для сопоставления IDataReader с вашим объектом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...