[转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html

/*****************************************
* 说明:利用反射将数据库查询的内容自动绑定
*       到实体类
*
* 时间:1:49 2009-9-19
*
* 程序员:王文壮
* ***************************************/
/****************数据库脚本***************
* create database MySchool
* go
* use MySchool
* go
* create table Student
* (
* ID int identity primary key,
* Name varchar(10)
* )
* ****************************************/
using System;
using System.Reflection;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;

namespace ReflectionDemo
{
    #region Main
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet();

#region 连接数据库构建DataSet

//SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=MySchool;Integrated Security=True");
            //SqlDataAdapter objAdapter = new SqlDataAdapter("Select * from student", con);
            //objAdapter.Fill(ds);

#endregion

#region 手动构建DataSet

DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("Name");
            DataRow row = dt.NewRow();
            row["ID"] = 1;
            row["Name"] = "灰太狼";
            dt.Rows.Add(row);
            ds.Tables.Add(dt);
            #endregion

List<Student> students = new List<Student>();
            foreach (DataRow dataRow in ds.Tables[0].Rows)
            {
                Student stu = new Student();
                Utility.ConvertToEntity(stu, row);
                students.Add(stu);
            }
            foreach (Student student in students)
            {
                Console.WriteLine(student.Name);
            }
        }
    }
    #endregion

#region 实体类

/// <summary>
    /// 实体类,需要在属性
    /// 上添加自定义特性
    /// 每个实体类对应数据表里
    /// 的一个字段,注意,自定义特性里的参数
    /// 一定要和数据表里的字段一一对应,
    /// 否则就反射不到了!
    /// </summary>
    public class Student
    {
        [DataContextAttribute("ID")]
        public int ID { get; set; }
        [DataContext("Name")]
        public string Name { get; set; }
    }

#endregion

#region 自定义特性

/// <summary>
    /// 自定义特性
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class DataContextAttribute : Attribute
    {
        /// <summary>
        /// 自定义特性
        /// </summary>
        /// <param name="fieldName">数据表字段名称</param>
        public DataContextAttribute(string property) { this.Property = property; }
        /// <summary>
        /// 数据表字段属性(实体属性)
        /// </summary>
        public string Property { get; set; }
    }

#endregion

#region 反射

public class Utility
    {
        /// <summary>
        /// 将DataRow转换成实体
        /// </summary>
        /// <param name="obj">实体</param>
        /// <param name="row">数据表一行数据</param>
        public static void ConvertToEntity(object obj, DataRow row)
        {
            ///得到obj的类型
            Type type = obj.GetType();
            ///返回这个类型的所有公共属性
            PropertyInfo[] infos = type.GetProperties();
            ///循环公共属性数组
            foreach (PropertyInfo info in infos)
            {
                ///返回自定义属性数组
                object[] attributes = info.GetCustomAttributes(typeof(DataContextAttribute), false);
                ///将自定义属性数组循环
                foreach (DataContextAttribute attribute in attributes)
                {
                    ///如果DataRow里也包括此列
                    if (row.Table.Columns.Contains(attribute.Property))
                    {
                        ///将DataRow指定列的值赋给value
                        object value = row[attribute.Property];
                        ///如果value为null则返回
                        if (value == DBNull.Value) continue;
                        ///将值做转换
                        if (info.PropertyType.Equals(typeof(string)))
                        {
                            value = row[attribute.Property].ToString();
                        }
                        else if (info.PropertyType.Equals(typeof(int)))
                        {
                            value = Convert.ToInt32(row[attribute.Property]);
                        }
                        else if (info.PropertyType.Equals(typeof(decimal)))
                        {
                            value = Convert.ToDecimal(row[attribute.Property]);
                        }
                        else if (info.PropertyType.Equals(typeof(DateTime)))
                        {
                            value = Convert.ToDateTime(row[attribute.Property]);
                        }
                        else if (info.PropertyType.Equals(typeof(double)))
                        {
                            value = Convert.ToDouble(row[attribute.Property]);
                        }
                        else if (info.PropertyType.Equals(typeof(bool)))
                        {
                            value = Convert.ToBoolean(row[attribute.Property]);
                        }
                        ///利用反射自动将value赋值给obj的相应公共属性
                        info.SetValue(obj, value, null);
                    }
                }
            }
        }
    }

#endregion
}

时间: 2025-01-15 03:41:57

[转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值的相关文章

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr

C#连接Oracle数据库查询数据

C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; using System.Collections.Generic; using System.ComponentModel using System.Data.OracleClient;;//这行和下一行都要先在引用中填加system.data.oracleclient using System.Da

SpringMVC——项目启动时从数据库查询数据

SpringMVC项目中遇到这样的问题: 1.很多数据字典需要从数据库中查询: 2.懒得修改SQL语句: 3.想在项目中声明静态变量存储数据字典,但是希望这个字典可以在项目启动时进行加载. 当遇到这样的问题时,可以通过实现org.springframework.beans.factory.InitializingBean接口进行实现这一功能. 只需要实现afterPropertiesSet()方法就将在项目扫描完注解时调用这一方法,在这个方法内调用数据库查询的方法,查出所有数据字典,并保存在静态

简单地从数据库查询数据使用poi插入创建Excel

本次使用到的jar包 代码 public class CreateExcel01 { // 数据库查询 public static List<Account> query() { String sql = "select * from tb_account"; List<Account> list = BaseDao.findRows(sql, null, Account.class); return list; } // 创建Excel public stat

java实现从一个数据库查询数据经过处理导入另外一个数据库中

当数据库表中有clob字段或要对表中数据做较复杂处理时就不太好用脚本从一个数据库导入数据到另外一个数据库中了,这时就要通过代码实现了,下面以orale数据库为例代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; import java.text

脚本——loadrunner连接oracle数据库查询数据

import java.io.*; import java.sql.*; import lrapi.lr; public class Actions { int sum=0; public int init() throws Throwable { return 0; }//end of init public int action() throws Throwable { try{ //定义了数据库连接串 /*DSN=ORACL_LR;UID=FASP_150001;PWD=1;DBQ=192

sqlserver数据库查询数据

数据查询-列别名 //使用AS来命名列 SELECT SCode AS 学生编号,SName AS 学生姓名, SAddress AS 学生地址 FROM Students WHERE SAddress <> '河南新乡'//使用=来命名列 SELECT 姓名 = FirstName+'.'+LastName FROM Employees注意: 1. + 连接的数据类型必须兼容 2. 如果 + 连接字符型数据,结果为字符串数据的连接 3. 如果 + 连接数值型数据,结果为数值的和 数据查询-限

Android数据库 — — —查询数据

package com.example.datebasetest; import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;impor

从数据库查询数据然后拼接成xml文件

<%@page import="java.util.HashSet"%> <%@page import="java.util.Set"%> <%@page import="java.util.List"%> <%@page import="java.net.URLDecoder"%> <%@page import="org.apache.el.lang.Expre