C#反射在数据库连接时的应用
反射的应用
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#反射在数据库连接时的应用的更多相关文章
- 外壳exe通过反射调用dll时
外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ...
- mysql autocommit=OFF导致wordpress 建立数据库连接时出错
今天安装wordpress完成后跳转到login页面时,出现建立数据库连接时出错.网上清一色的拷贝http://mt.sohu.com/20160917/n468547634.shtml的答案. 只能 ...
- 在IDEA中使用JDBC获取数据库连接时的报错及解决办法
在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...
- FireDac 与数据库连接时字符集及对应的字段类型问题
近日在一个过程调用时发生一个奇怪现象, 异常返回意思是说, 数据的长度是[6], 而字段定义的长度是[3]. 分析后认为: 调用过程你不涉及到对返回数据集的字段手动定义问题, 出现这个问题应是两边 ...
- 关于数据库连接时URL的问题
最近在写一个简单的增删改查的代码时,遇到保存的中文都会变成问号(?),由于刚开始只是一些数据的保存,所以认为之后只要对数据库的编码进行修改即可,但是后来要对数据进行查找的时候发现根本查找不到, 当时用 ...
- Android中的自定义注解(反射实现-运行时注解)
预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...
- Java——反射:运行时的类信息
RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情. 2.什么情况下需要反射 假设 ...
- JAVA_基础反射创建运行时类的对象
通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...
- 利用反射调用方法时,处理ref,out参数需要注意的问题(转)
转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...
- 通过hibernate session.connection()获得数据库连接时,导致的查询缓慢甚至假死机问题
在使用hibernate的应用中,如果需要直接使用Java.sql.Connection,一般我们是通过hibernate的session.connection()获得的,然后session.clos ...
随机推荐
- vue3.4的更新,保证你看的明明白白
defineModel 同学已经转正 defineModel 在vue3.3中还是一个实验性功能, 但是经过一个学期的努力,该同学已经转正. defineModel的简单介绍 defineModel( ...
- ARM+DSP异构多核——全志T113-i+玄铁HiFi4核心板规格书
核心板简介 创龙科技SOM-TLT113是一款基于全志科技T113-i双核ARM Cortex-A7 + 玄铁C906 RISC-V + HiFi4 DSP异构多核处理器设计的全国产工业核心板,ARM ...
- c语言生成随机数
记录示例,留作自用 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) ...
- 拟合算法与matlab工具包实现
与插值问题不同,在拟合问题中不需要曲线一定经过给定的点.拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数) 目录 一.插值和拟合的区 ...
- weui weui-switch 开关取值,设置默认状态
html <div class="weui-cell__ft"> <input class="weui-switch" type=" ...
- Spring(XML方式)简单入门
环境准备 maven jdk Spring Eclipse 项目创建 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- 【实操记录】MySQL二进制安装包部署
截至2023年11月2日,MySQL社区版最新版本是8.0.35,本文详细描述了采用二进制安装的各个步骤,具有较强的参考意义,基本可作为标准步骤实施. ■ 下载数据库介质 社区版的下载地址为oracl ...
- FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作
<FFmpeg开发实战:从零基础到短视频上线>一书的"2.1.2 音视频文件的封装格式"介绍了视频流的PS格式和TS格式.由于TS包的长度固定,从TS流的任一片段开 ...
- Docker运维之容器的日志清理
在容器运行的过程中,通常会产生大量的日志,尤其是应用程序本身记录了info级别的日志时候,程序的标准输出记录到容器的日志.这样会占用大量的磁盘空间,严重者导致IO异常,最终服务会宕机. 方案一:定期手 ...
- django 设置外键的时候,related_name的值大写还是小写,规则怎样
django 设置外键的时候,related_name的值大写还是小写,规则怎样 在Django中,related_name参数用于定义反向关系的名称,即通过外键字段反向查询关联模型的对象.relat ...