首页 > 数据库 >Winform/Csharp中连接Mysql并执行指定sql,查询结果通过反射映射为对象的List

Winform/Csharp中连接Mysql并执行指定sql,查询结果通过反射映射为对象的List

时间:2023-03-24 20:15:19浏览次数:57  
标签:string get List Csharp driver sql mail dt public

场景

Winform中连接Mysql8并查询表中数据进行显示:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/120395988

在上面连接Mysql的基础上,如果需要连接Mysql并执行指定的sql语句,并且将

查询结果转换为对象的list数据。

sql语句执行的查询结果

 

 

查询并映射后的结果

 

 

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、代码比较简单,直接附代码

        private void button3_Click(object sender, EventArgs e)
        {
            connetStr = "server= 127.0.0.1;UserId=root;password=123;database=test"; 
            mySqlConnection = new MySqlConnection(connetStr);
            try
            {
                mySqlConnection.Open(); //连接数据库
                MessageBox.Show("数据库连接成功", "提示", MessageBoxButtons.OK);
                string searchStr = "SELECT mail.car_number,mail.driver_number ,driver.name as driver_name FROM bus_mail_list mail LEFT JOIN bus_driver_info driver on mail.driver_number = driver.account_number";
                DataTable dataTable = getMySqlRead(searchStr);
                mailList = DataTableToList<BusMailList>(dataTable);
                mailList.ForEach(mail =>
                {
                    Console.WriteLine(mail.driver_name + mail.driver_number);
                });
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK);     //显示错误信息
            }         
        }

2、其中连接数据的字符串中配置ip、用户名密码等信息。

需要提前声明一些变量

        List<BusMailList> mailList = new List<BusMailList>();

        string connetStr = String.Empty;

        MySqlConnection mySqlConnection = null;

然后新建要反射后的对象

    public class BusMailList
    {
        public long binding_time { get; set; }
        public string car_number { get; set; }
        public string driver_name { get; set; }
        public string driver_number { get; set; }
        public int id { get; set; }
        public long update_time { get; set; }

    }

注意这里要与数据库查询结果字段对应一致。

查询结果只需要三个字段,实体对象可以有多个属性,但是实体对象的三个属性需要与查询结果的字段一致。

然后注意的是,这里实体对象没有重写构造方法,如果重写了构造方法的话,必须再声明无参的构造方法。

举个其他实体对象的例子

    class CarInfoVo
    {
        public string car_Num { get; set; }
        public string car_Type { get; set; }

        public CarInfoVo()
        {

        }

        public CarInfoVo(string carNum, string carType)
        {
            car_Num = carNum;
            car_Type = carType;
        }
    }

其中用到的两个方法是创建MysqlDataReader对象的getMySqlRead方法

        public DataTable getMySqlRead(string M_str_sqlstr)
        {  
            MySqlCommand mysqlcom = new MySqlCommand(M_str_sqlstr, mySqlConnection);
            MySqlDataAdapter mda = new MySqlDataAdapter(mysqlcom);
            DataTable dt = new DataTable();
            mda.Fill(dt);
            mySqlConnection.Close();
            return dt;
        }

另一个是利用反射将DataTabel转换为对象list的DataTableToList

        public List<T> DataTableToList<T>(DataTable dt)
        {
            //确认参数有效
            if (dt == null)
                return null;

            List<T> list = new List<T>();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //创建泛型对象
                T _t = Activator.CreateInstance<T>();
                //获取对象所有属性
                PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    foreach (PropertyInfo info in propertyInfo)
                    {
                        //属性名称和列名相同时赋值
                        if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
                        {
                            if (dt.Rows[i][j] != DBNull.Value)
                            {
                                info.SetValue(_t, dt.Rows[i][j], null);
                            }
                            else
                            {
                                info.SetValue(_t, null, null);
                            }
                            break;
                        }
                    }
                }
                list.Add(_t);
            }
            return list;
     }

 

标签:string,get,List,Csharp,driver,sql,mail,dt,public
From: https://www.cnblogs.com/badaoliumangqizhi/p/17253179.html

相关文章

  • Python3之sqlalchemy
    1.SQLAlchemy介绍SQLAlchemy是Python中一款非常优秀的ORM框架,它可以与任意的第三方web框架相结合,如flask、tornado、django、fastapi等。SQLALchemy相较于Django......
  • mysql 订单产品表,一个订单对应多个产品,查询只包含产品A001,A002,A003的订单
    假设订单产品表的表名为order_product,包含字段如下:order_id:订单IDproduct_id:产品ID下面是查询只包含产品A001,A002,A003的订单的SQL语句:SELECTorder_idFROMorder......
  • MyBatisPlus中全局Sql注入器应用_逻辑删除使用
    什么是逻辑删除假删除、逻辑删除,并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据的一个逻辑字段置为删除状态。实现全局配置注入LogicSqlInjector打开项目的......
  • MyBatisPlus插件扩展_SqlExplainInterceptor执行分析插件的使用
    简介SQL执行分析拦截器【目前只支持MYSQL-5.6.3以上版本】,作用是分析处理DELETEUPDATE语句,防止小白或者恶意deleteupdate全表操作!com.baomidou.mybatisplus.pl......
  • 在docker上安装MySQL和Redis
    1.通过docker命令下载mysql5.7镜像mysql5.7前期准备2.通过docker命令下载mysql8.0镜像mysql8.0前期准备3.通过docker命令下载redis镜像redis前期准备本文永......
  • MYSQL注入流程
    一、判断注入点(与数据库有交互的地方)浏览网站各个地方-->查找有可控参数的地方(特别注意url)并观察网站页面变化情况  根据参数传输方式传输的不同,可以把SQL注入分为GE......
  • python stata转mysql
    importnumpyasnpimportpyreadstataspyreadstatimportjson,re,random,pymysql,configparser,sysimportpandasaspdfromduconfigimportread_inidefdujieg......
  • coe_xfr_sql_profile.sql脚本绑定执行计划
    ***原文:https://www.modb.pro/db/570546大家在实际数据库运维中,总会遇到这样的问题:1、某个sql非常慢或者突然变得非常慢,查看后发现sql选择了错误的执行计划。如果这个sql......
  • 《SQL与数据库基础》22. 分库分表(二)
    目录分库分表(二)MyCat分片规则范围分片取模分片一致性hash分片枚举分片应用指定算法固定分片hash算法字符串hash解析按天分片自然月分片MyCat原理MyCat管理MyCat-eye本文......
  • Python数据库操作—— PostgreSQL
    使用pip3安装psycopg2pipinstallpsycopg2增删改查(CRUD)新建数据库PostgreSQL不支持"SHOWDATABASES"语句,需要使用"SELECT*FROMPG_DATABASE;"进行查询,才能获取......