反射的应用

1.查找指定ID的数据

//查找指定id的数据,返回指定的对象

private T FindData<T>(int id)

{

Type ty = typeof(T);

//在这里创建实例对象的时候不能转成指定的类型,只能是Object对象

//转成指定类型后面就赋值不成功

// T t=(T)Activator.CreateInstance(ty);

//原来我是这么写的,也能创建实例对象,但后面怎么赋值都不行,全是NULL,

//特别要注意这点,要赋值完后才转成指定的类型

object obj = Activator.CreateInstance(ty);

string sql = $"select * from [{ty.Name}] where ID={id}";

OleDbConnection conn = new OleDbConnection(connString);

OleDbCommand cmd = new OleDbCommand(sql, conn);

conn.Open();

OleDbDataReader dr = cmd.ExecuteReader();

dr.Read();

foreach (var v in ty.GetFields())

{

if(v.FieldType.FullName=="System.Int32")     //在这判断字段类型,我这只有两种类型int,string,如果类型多就要多写几种判断

{

obj.GetType().GetField($"{v.Name}").SetValue(obj, int.Parse(dr[$"{v.Name}"].ToString()));       //第一种方法赋值

}

else

{

ty.GetField(name: $"{v.Name}").SetValue(obj, dr[$"{v.Name}"].ToString());          //第二种方法赋值

}

}

dr.Close();

conn.Close();

//var vname = obj.GetType().GetField("mAge");

//vname.SetValue(obj, 23);

//赋值完了才转成指定的类型

return (T)obj;

}

2.添加数据到数据库中

private bool Insert_Into<T>(T t)

{

int nRet = 0;

string intoSql = null;

string fileName = null;

string fileValue = null;

List<OleDbParameter> parList = new List<OleDbParameter>();

Type ty = t.GetType();

foreach (System.Reflection.FieldInfo v in ty.GetFields())

{

fileName += v.Name + ",";

fileValue += $"@{v.Name},";

OleDbParameter par = new OleDbParameter($"@{v.Name}", v.GetValue(t));

parList.Add(par);

}

fileName = fileName.Substring(0, fileName.Length - 1);

fileValue = fileValue.Substring(0, fileValue.Length - 1);

intoSql = $"INSERT INTO [{ty.Name}] ({fileName}) VALUES ({fileValue})";

using (OleDbConnection conn = new OleDbConnection(connString))

{

using (OleDbCommand cmd = new OleDbCommand(intoSql, conn))

{

cmd.Parameters.Clear();

cmd.Parameters.AddRange(parList.ToArray());

conn.Open();

nRet = cmd.ExecuteNonQuery();

conn.Close();

}

}

return nRet == 1;

}

3.修改数据

private bool UpdateData<T>(int id,T t)

{

int nRet = 0;

string intoSql = null;

string fileName = null;

List<OleDbParameter> parList = new List<OleDbParameter>();

Type ty = t.GetType();

foreach (System.Reflection.FieldInfo v in ty.GetFields())

{

fileName += v.Name + $"=@{v.Name},";

OleDbParameter par = new OleDbParameter($"@{v.Name}", v.GetValue(t));

parList.Add(par);

}

fileName = fileName.Substring(0, fileName.Length - 1);

intoSql = $"UPDATE [{ty.Name}] SET {fileName} WHERE ID={id}";

using (OleDbConnection conn = new OleDbConnection(connString))

{

using (OleDbCommand cmd = new OleDbCommand(intoSql, conn))

{

cmd.Parameters.Clear();

cmd.Parameters.AddRange(parList.ToArray());

conn.Open();

nRet = cmd.ExecuteNonQuery();

conn.Close();

}

}

return nRet == 1;

}

4.删除数据

private bool DeleteData<T>(int id)

{

int nRet = 0;

string intoSql = null;

Type ty = typeof(T);

intoSql = $"DELETE FROM [{ty.Name}] WHERE ID={id}";

using (OleDbConnection conn = new OleDbConnection(connString))

{

using (OleDbCommand cmd = new OleDbCommand(intoSql, conn))

{

conn.Open();

nRet = cmd.ExecuteNonQuery();

conn.Close();

}

}

return nRet == 1;

}

5.读取所有数据,返回一个所有数据的表

private DataTable GetDataTable<T>()

{

DataTable dt = new DataTable();

Type ty = typeof(T);

string sql = $"SELECT * FROM [{ty.Name}]";

using (OleDbConnection conn = new OleDbConnection(connString))

{

using (OleDbCommand cmd = new OleDbCommand(sql, conn))

{

conn.Open();

OleDbDataAdapter da = new OleDbDataAdapter(cmd);

da.Fill(dt);

}

conn.Close();

}

return dt;

}

C#反射在数据库连接时的应用的更多相关文章

  1. 外壳exe通过反射调用dll时

    外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ...

  2. mysql autocommit=OFF导致wordpress 建立数据库连接时出错

    今天安装wordpress完成后跳转到login页面时,出现建立数据库连接时出错.网上清一色的拷贝http://mt.sohu.com/20160917/n468547634.shtml的答案. 只能 ...

  3. 在IDEA中使用JDBC获取数据库连接时的报错及解决办法

    在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...

  4. FireDac 与数据库连接时字符集及对应的字段类型问题

    近日在一个过程调用时发生一个奇怪现象, 异常返回意思是说, 数据的长度是[6], 而字段定义的长度是[3].  分析后认为:  调用过程你不涉及到对返回数据集的字段手动定义问题, 出现这个问题应是两边 ...

  5. 关于数据库连接时URL的问题

    最近在写一个简单的增删改查的代码时,遇到保存的中文都会变成问号(?),由于刚开始只是一些数据的保存,所以认为之后只要对数据库的编码进行修改即可,但是后来要对数据进行查找的时候发现根本查找不到, 当时用 ...

  6. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  7. Java——反射:运行时的类信息

    RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情.  2.什么情况下需要反射 假设 ...

  8. JAVA_基础反射创建运行时类的对象

    通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...

  9. 利用反射调用方法时,处理ref,out参数需要注意的问题(转)

    转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...

  10. 通过hibernate session.connection()获得数据库连接时,导致的查询缓慢甚至假死机问题

    在使用hibernate的应用中,如果需要直接使用Java.sql.Connection,一般我们是通过hibernate的session.connection()获得的,然后session.clos ...

随机推荐

  1. AT_joisc2019_j 题解

    先考虑这个式子: \[\sum_{j=1}^{M} |C_{k_{j}} - C_{k_{j+1}}| \] 一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明. 那么现在式子变成: \ ...

  2. javaweb使用gson工具使浏览器返回json数据

    1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)序列化:对象序列化的最主要的用处就是在传递和保 ...

  3. 启动数据分析软件SPSS17遭遇的两弹窗解决方案

    问题描述 朋友请我帮她安装 SPSS17 这款软件,我寻思这是啥软件,谷歌一下,发现是一个数据分析工具. 在一系列的下一步.确定后,打开时,第 1 个惊喜弹窗来了: [弹窗内容]应用程序无法启动,因为 ...

  4. 统计里面PV 和 UV代表什么意思

    1.网站流量bai统计中"PV"它所代表的意思是访问量了,具体指的du就是网站zhi的页面点击量或是浏览量,亦或是页面的刷新量dao了,网站的页面每刷新一次,就统计一个" ...

  5. npm ERR! `perfix` is not a valid npm option

    全局路径cmd命令:npm config set perfix "D:\Program Files\nodejs\node_global" 缓存路径cmd命令:npm config ...

  6. [oeasy]python0050_动态类型_静态类型_编译_运行

    动态类型_静态类型 回忆上次内容 上次了解了 帮助文档的 生成 开头的三引号注释 可以生成 帮助文档 文档 可以写成网页   python3 本身 也有 在线的帮助手册   目前的程序 提高了 可读性 ...

  7. Known框架实战演练——进销存数据结构

    系统主要包含商品信息.商业伙伴(客户.供应商)信息.业务单表头信息.业务单表体信息.对账单表头信息.对账单表体信息. 1. 商品信息(JxGoods) 该表用于存储公司商品信息. 名称 代码 类型 长 ...

  8. 简单写写IO流里的一些高级流

    缓冲流Buffered:缓冲流是一种高级的流,他可以对file类的流进行包装,内部含有一种缓冲池,可以在一定程度上提高IO的读写效率 不过,按实验来看,只要给低级流和缓冲流相似的byte读写,其实两者 ...

  9. ClickHouse的向量处理能力

    ClickHouse的向量处理能力 引言 在过去,非结构化数据(如文本.图片.音频.视频)通常被认为难以在数据库中直接使用,因为这些数据类型的多样性和复杂性.然而,随着技术的发展,嵌入技术可以将非结构 ...

  10. 【Java】Map 映射接口 概述

    Map 映射接口 概述 Map是一个双列数据,存储K-V类型的数据 JDK1.2 - HashMap 是目前Map的主要实现类 JDK1.2 线程不安全的,效率高,可存储null的key和value ...