如何从datatable自动创建类

时间:2011-11-22 01:26:41

标签: c# sql class serialization datatable

我知道有一种比我更清洁的方式。基本上,我从我的sql数据库中检索数据表。我现在希望将这些信息放在可全局访问的类中。我不想像这样遍历每一列:txtFirstName.Text = dt [0] .ToString()。我想创建一个“User”类,并分配txtFirstName.Text = User.FirstName。但是,我不想手动将dt [0]映射到FirstName,将dt [1]映射到LastName ...我希望自动创建对象!或者,至少在创建类之后,元素与dt列的名称匹配,映射应该自动发生。

谢谢!

5 个答案:

答案 0 :(得分:4)

为什么不将Linq用于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();

答案 1 :(得分:3)

你基本上要求ORM(对象关系映射)。 .NET附带的其中两个是LINQ to SQLEntity Framework。其他也存在,例如NHibernate。该主题非常复杂,因此您可能需要调查所有选项并选择哪种方案最适合您的方案。

答案 2 :(得分:2)

不要自己动手。这太过分了。使用LINQ-to-SQL。命令行工具sqlmetal会将现有架构转换为可在LINQ查询中直接使用的C#文件。事实上,当这个问题突然出现时,我正在为我们的FogBugz数据库做这件事:

sqlmetal /server:<our-server> /database:fogbugz /views /functions /sprocs /code:fogbugz.cs

答案 3 :(得分:0)

您可以使用将数据库表映射到对象的ORM。其他选择包括

  1. 创建一个T4模板以从数据库中读取并使用“映射”代码创建对象。 (http://msdn.microsoft.com/en-us/library/bb126445.aspx
  2. 创建类并使用AutoMapper将IDataReader映射到您的对象。

答案 4 :(得分:0)

你可以使用反射,像这样: 对不起,评论是chinaese 您可以这样调用: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