数据库查询 - DataTable转Entity类型数据

当使用Sql语句查询数据库,返回DataSet数据集。

DataSet转化为数据列表,可以通过映射方式直接返回Entity数据列表

新建一个特性类,用于数据库列表列名称映射

LinqToDB提供了一个ColumnAttribute,但是通过反射不方便获取ColumnAttribute
获取CustomAttributes时,虽然可以筛选到指定ColumnAttribute,但是CustomAttributeData不容易转换到ColumnAttribute

var customAttributeDatas = mi.CustomAttributes.Where(i=>i.AttributeType.Name==nameof(ColumnAttribute)).ToList();

以下是自定义的特性类

 1     [AttributeUsage(AttributeTargets.Property)]
 2     public sealed class ColumnFieldAttribute : Attribute
 3     {
 4         /// <summary>
 5         /// 表对应的字段名
 6         /// </summary>
 7         public string ColumnName { set; get; }
 8 
 9         public ColumnFieldAttribute(string columnName)
10         {
11             ColumnName = columnName;
12         }
13     }

通过反射,将DataTable转换为数据列表

 1     /// <summary>
 2     /// 将DataRow/DataTable转换成Entity类型
 3     /// </summary>
 4     public static class DataTableConverter<T> where T : new()
 5     {
 6         /// <summary>
 7         /// 将DataTable转换成Entity列表
 8         /// </summary>
 9         /// <param name="dt"></param>
10         /// <returns></returns>
11         public static List<T> ToList(DataTable dt)
12         {
13             List<T> list = new List<T>(dt.Rows.Count);
14             foreach (DataRow dr in dt.Rows)
15             {
16                 list.Add(ToEntity(dr));
17             }
18             return list;
19         }
20         /// <summary>
21         /// 将DataRow行转换成Entity
22         /// </summary>
23         /// <param name="dr"></param>
24         /// <returns></returns>
25         private static T ToEntity(DataRow dr)
26         {
27             T entity = new T();
28             Type info = typeof(T);
29             var members = info.GetMembers();
30             foreach (var memberInfo in members)
31             {
32                 if (memberInfo.MemberType == MemberTypes.Property)
33                 {
34                     //读取属性上的DataField特性
35                     object[] attributes = memberInfo.GetCustomAttributes(typeof(ColumnFieldAttribute), true);
36                     foreach (var attr in attributes)
37                     {
38                         var dataFieldAttr = attr as ColumnFieldAttribute;
39                         if (dataFieldAttr != null)
40                         {
41                             var propInfo = info.GetProperty(memberInfo.Name);
42                             if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
43                             {
44                                 //根据ColumnName,将dataRow中的相对字段赋值给Entity属性
45                                 propInfo.SetValue(entity,
46                                     Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
47                                     null);
48                             }
49                         }
50                     }
51                 }
52             }
53             return entity;
54         }
55     }

 

在C#中,如果你想要将一个DataTable中的数据批量插入到数据库中,你可以使用ADO.NET提供的功能来完成这个任务。DataTable是.NET Framework中的一个类,它代表了内存中的一个数据表,可以包含多行多列的数据。以下是一个简单的过程,用于将DataTable中的数据批量插入到数据库中: 1. 确保你已经有了一个DataTable实例,其中包含了要插入到数据库中的数据。 2. 创建一个数据库连接对象(例如SqlConnection)。 3. 创建一个SqlDataAdapter实例或使用Entity Framework等ORM工具。 4. 配置SqlDataAdapter的SelectCommand属性为一个适当的SELECT语句,用于从DataTable中获取数据。 5. 使用SqlDataAdapter的InsertCommand属性来设置用于插入数据SQL命令。 6. 调用SqlDataAdapter的Update方法来执行插入操作。 这里是一个简单的代码示例,演示了如何使用SqlDataAdapter来插入DataTable中的数据: ```csharp using System; using System.Data; using System.Data.SqlClient; public void InsertDataTableIntoDatabase(DataTable table, string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { // 创建SqlDataAdapter实例 SqlDataAdapter adapter = new SqlDataAdapter(); // 打开连接 connection.Open(); // 配置DataAdapter的InsertCommand属性 adapter.InsertCommand = new SqlCommand("INSERT INTO YourTable (Column1, Column2) VALUES (@Value1, @Value2)", connection); adapter.InsertCommand.Parameters.Add("@Value1", SqlDbType.VarChar).SourceColumn = "Column1"; adapter.InsertCommand.Parameters.Add("@Value2", SqlDbType.Int).SourceColumn = "Column2"; // 使用Update方法批量插入数据 adapter.Update(table); // 关闭连接 connection.Close(); } } ``` 在上面的示例中,`YourTable` 是数据库中的表名,`Column1` 和 `Column2` 是表中的列名。你需要将这些名称替换为实际的表名和列名。`table` 是你要插入数据DataTable实例,`connectionString` 是数据库连接字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值