/// <summary>
/// 提供将MySqlDataReader转成T类型的扩展方法
/// </summary>
public static class MySqlDataReaderExt
{
private static readonly object Sync = new object(); /// <summary>
/// 属性反射信息缓存 key:类型的hashCode,value属性信息
/// </summary>
private static readonly Dictionary<int, Dictionary<string, PropertyInfo>> PropInfoCache =
new Dictionary<int, Dictionary<string, PropertyInfo>>(); /// <summary>
/// 将MySqlDataReader转成T类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="readers"></param>
/// <returns></returns>
public static T To<T>(this MySqlDataReader reader,bool IsInner=false)
where T : new()
{ if (reader == null || reader.HasRows == false) return default(T);
if (!IsInner)
{
reader.Read();
}
var res = new T();
var propInfos = GetFieldnameFromCache<T>(); for (int i = ; i < reader.FieldCount; i++)
{
var n = reader.GetName(i).ToLower();
if (propInfos.ContainsKey(n))
{
PropertyInfo prop = propInfos[n];
var isValueType = prop.PropertyType.IsValueType;
object defaultValue = null; //引用类型或可空值类型的默认值
if (isValueType)
{
if ((!prop.PropertyType.IsGenericType)||
(prop.PropertyType.IsGenericType &&
prop.PropertyType.GetGenericTypeDefinition() != typeof(Nullable<>)))
{
defaultValue = ; //非空值类型的默认值
}
}
var type= reader.GetFieldType(i);
var v = reader.GetValue(i);
dynamic temp=null;
if (prop.PropertyType.Name == "Int32" && v != DBNull.Value)
{
temp = Convert.ToInt32(v);
}
else if (prop.PropertyType.Name == "Boolean" && v != DBNull.Value)
{
if ((type == typeof(int) || type == typeof(long)))
{
temp = Convert.ToInt32(v) == ;
}
} temp = temp ?? v;
prop.SetValue(res, (Convert.IsDBNull(temp) ? defaultValue : temp));
}
} return res;
} private static Dictionary<string, PropertyInfo> GetFieldnameFromCache<T>()
{
var hashCode = typeof (T).GetHashCode();
var filedNames = GetFieldName<T>();
Dictionary<string, PropertyInfo> res;
lock (Sync)
{
if (!PropInfoCache.ContainsKey(hashCode))
{
PropInfoCache.Add(hashCode, filedNames);
}
res = PropInfoCache[hashCode];
}
return res;
} /// <summary>
/// 获取一个类型的对应数据表的字段信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private static Dictionary<string, PropertyInfo> GetFieldName<T>()
{
var props = typeof (T).GetProperties();
return props.ToDictionary(item => item.GetFieldName());
} /// <summary>
/// 将MySqlDataReader转成List类型
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="reader">数据读取器</param>
/// <returns></returns>
public static List<T> ToList<T>(this MySqlDataReader reader)
where T : new()
{
if (reader == null || reader.HasRows == false) return null;
var res = new List<T>();
while (reader.Read())
{
res.Add(reader.To<T>(true));
}
return res;
} /// <summary>
/// 获取该属性对应到数据表中的字段名称
/// </summary>
/// <param name="propInfo"></param>
/// <returns></returns>
public static string GetFieldName(this PropertyInfo propInfo)
{
var fieldname = propInfo.Name;
var attr = propInfo.GetCustomAttributes(false);
foreach (var a in attr)
{
if (a is DataFieldAttribute)
{
fieldname = (a as DataFieldAttribute).Name;
break;
}
}
return fieldname.ToLower();
}
public static string ToUpdateSql(this object model, string key, ref List<KeyValuePair<string, object>> list)
{
try
{ StringBuilder sql = new StringBuilder();
string fileds = "";
Type m = model.GetType();
PropertyInfo[] property = m.GetProperties();
sql.Append("update " + m.Name + " set ");
for (int i = ; i < property.Length; i++)
{
if (property[i].Name == key)
continue;
if (property[i].GetValue(model, null) != null)
{
fileds += property[i].Name + "=@s" + i + " ,"; list.Add(new KeyValuePair<string, object>("@s" + i, property[i].GetValue(model, null)));
} }
fileds = fileds.Substring(, fileds.LastIndexOf(",", StringComparison.Ordinal));
sql.Append(fileds);
sql.Append(" where " + key + "=@key");
list.Add(new KeyValuePair<string, object>("@key", m.GetProperty(key).GetValue(model, null).ToString()));
return sql.ToString();
}
catch
{
return "";
} } public static string ToAddSql(this object model, string key, ref List<KeyValuePair<string, object>> list)
{
try
{ StringBuilder sql = new StringBuilder();
Type m = model.GetType();
PropertyInfo[] property = m.GetProperties(); string values = string.Empty;
string keys = string.Empty;
for (int i = ; i < property.Length; i++)
{
if (property[i].Name == key || property[i].GetValue(model, null) == null)
continue;
keys += property[i].Name + " ,";
values += "@s" + i + ","; list.Add(new KeyValuePair<string, object>("@s" + i, property[i].GetValue(model, null)));
}
keys = keys.Substring(, keys.LastIndexOf(','));
values = values.Substring(, values.LastIndexOf(','));
sql.AppendFormat("insert into " + m.Name + "({0}) values({1});select @@IDENTITY", keys, values);
//list.Add(new KeyValuePair<string, object>("@key", M.GetProperty(key).GetValue(model, null).ToString()));
return sql.ToString();
}
catch
{
return "";
} } public static string ToAddSql(this object model, string key)
{
try
{ StringBuilder sql = new StringBuilder();
Type m = model.GetType();
PropertyInfo[] property = m.GetProperties(); string values = string.Empty;
string keys = string.Empty;
for (int i = ; i < property.Length; i++)
{
if (property[i].Name == key)
continue;
if (property[i].GetValue(model, null) != null)
{ keys += property[i].Name + " ,";
if (property[i].PropertyType.Name.Contains("String") ||
property[i].PropertyType.FullName.Contains("DateTime"))
{
values += "'" + property[i].GetValue(model, null) + "',";
}
else
{
values += property[i].GetValue(model, null) + ",";
}
}
}
keys = keys.Substring(, keys.LastIndexOf(','));
values = values.Substring(, values.LastIndexOf(','));
sql.AppendFormat("insert into " + m.Name + "({0}) values({1});select @@IDENTITY;", keys, values);
return sql.ToString();
}
catch
{
return "";
}
}
} public class DataFieldAttribute : Attribute
{
public string Name { get; set; } public DataFieldAttribute()
{ } public DataFieldAttribute(string name)
{
Name = name;
}
}
 /// <summary>
/// inset
/// </summary>
/// <param name="ID">主键id</param>
/// <returns>int返回ID</returns>
public static string Insert(object Model, string ID)
{
List<MySqlParameter> param = new List<MySqlParameter>();
StringBuilder commandText = new StringBuilder(" insert into ");
Type type = Model.GetType();
//T mode = Activator.CreateInstance<T>();
string tableName = type.Name;
PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
StringBuilder filedStr = new StringBuilder();
StringBuilder paramStr = new StringBuilder();
int len = pros.Length;
//if (!string.IsNullOrEmpty(ID))
//{ param = new MySqlParameter[len - 1]; }
//else
//{
// param = new MySqlParameter[len - 1];
//}
//int paramLindex = 0;
for (int i = ; i < len; i++)
{
string fieldName = pros[i].Name;
if (!fieldName.ToUpper().Equals(ID.ToUpper()) && pros[i].GetValue(Model, null) != null)
{
filedStr.Append(fieldName);
string paramName = "@" + fieldName;
paramStr.Append(paramName);
filedStr.Append(",");
paramStr.Append(",");
object val = type.GetProperty(fieldName).GetValue(Model, null);
if (val == null)
{
val = DBNull.Value;
}
param.Add(new MySqlParameter(fieldName, val));
//paramLindex++;
}
} commandText.Append(tableName);
commandText.Append("(");
commandText.Append(filedStr.ToString().Substring(, filedStr.ToString().LastIndexOf(',')));
commandText.Append(") values (");
commandText.Append(paramStr.ToString().Substring(, paramStr.ToString().LastIndexOf(',')));
commandText.Append(");select @@IDENTITY");
string InsertID = DbHelperSQL.ExecuteScalar(commandText.ToString(), param.ToArray());
return InsertID; }
///// <summary>
///// inset
///// </summary>
///// <param name="ID">主键id</param>
///// <returns>int返回ID</returns>
//public static string InsertTemp(object Model, string ID)
//{
// List<MySqlParameter> param = new List<MySqlParameter>();
// StringBuilder commandText = new StringBuilder(" insert into ");
// Type type = Model.GetType();
// //T mode = Activator.CreateInstance<T>();
// string tableName = type.Name;
// PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
// StringBuilder filedStr = new StringBuilder();
// StringBuilder paramStr = new StringBuilder();
// int len = pros.Length;
// //if (!string.IsNullOrEmpty(ID))
// //{ param = new MySqlParameter[len - 1]; }
// //else
// //{
// // param = new MySqlParameter[len - 1];
// //}
// //int paramLindex = 0;
// for (int i = 0; i < len; i++)
// {
// string fieldName = pros[i].Name;
// if (!fieldName.ToUpper().Equals(ID.ToUpper()) && pros[i].GetValue(Model, null) != null)
// {
// filedStr.Append(fieldName);
// string paramName = "@" + fieldName;
// paramStr.Append(paramName);
// filedStr.Append(",");
// paramStr.Append(",");
// object val = type.GetProperty(fieldName).GetValue(Model, null);
// if (val == null)
// {
// val = DBNull.Value;
// }
// param.Add(new MySqlParameter(fieldName, val));
// //paramLindex++;
// }
// } // commandText.Append(tableName);
// commandText.Append("(");
// commandText.Append(filedStr.ToString().Substring(0, filedStr.ToString().LastIndexOf(',')));
// commandText.Append(") values (");
// commandText.Append(paramStr.ToString().Substring(0, paramStr.ToString().LastIndexOf(',')));
// commandText.Append(");select @@IDENTITY");
// string InsertID = DbHelperSQL.ExecuteScalarTem(commandText.ToString(), param.ToArray());
// return InsertID; //} /// <summary>
/// update
/// </summary>
/// <param name="ID">主键id</param>
/// <returns>int返回影响条数</returns>
public static int Update(object Model, string ID)
{
List<MySqlParameter> param = new List<MySqlParameter>();
Type type = Model.GetType();
string tableName =type.Name;
//T model = Activator.CreateInstance<T>();
StringBuilder commandText = new StringBuilder(" update " + tableName + " set ");
PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
StringBuilder filedStr = new StringBuilder();
//int HaveNUM = 0;
int len = pros.Length;
//for (int i = 0; i < len; i++)
//{
// if (type.GetProperty(pros[i].Name).GetValue(Model, null) != null)
// {
// HaveNUM++;
// }
//}
if (type.GetProperty(ID).GetValue(Model, null) == null)
{
return ;
}
else if (type.GetProperty(ID).GetValue(Model, null).ToString() == "")
{
return ;
}
for (int i = ; i < len; i++)
{ string fieldName = pros[i].Name;
if (!fieldName.ToUpper().Equals(ID.ToUpper()))
{
if (type.GetProperty(fieldName).GetValue(Model, null) != null)
{
filedStr.Append(fieldName + "=@" + fieldName);
filedStr.Append(",");
object val = type.GetProperty(fieldName).GetValue(Model, null);
if (val == null)
{ val = DBNull.Value;
} param.Add(new MySqlParameter(fieldName, val)); }
}
} param.Add(new MySqlParameter(ID, type.GetProperty(ID).GetValue(Model, null)));
commandText.Append(filedStr.ToString().Substring(, filedStr.ToString().LastIndexOf(',')));
commandText.Append(" where " + ID + "=@" + ID);
object obj2 = DbHelperSQL.ExecuteSql(commandText.ToString(), param.ToArray());
if (obj2 == null)
{
return ;
}
else
{
return Convert.ToInt32(obj2);
} }
/// <summary>
/// updateList 事务修改
/// </summary>
/// <param name="ID">主键id</param>
/// <returns>int</returns>
public static int Update<T>(List<T> List, string ID)
{
List<CommandInfo> ListComd = new List<CommandInfo>();
List<KeyValuePair<string, object>> listparam;
//CommandInfo Model = new CommandInfo();
List<MySqlParameter> sqlParam;
MySqlParameter param;
string sql = "";
foreach (var item in List)
{
listparam = new List<KeyValuePair<string, object>>();
sqlParam = new List<MySqlParameter>();
sql = item.ToUpdateSql(ID, ref listparam);
foreach (var Keyvalue in listparam)
{
param = new MySqlParameter(Keyvalue.Key, Keyvalue.Value.GetType());
param.Value = Keyvalue.Value;
sqlParam.Add(param);
}
ListComd.Add(new CommandInfo(sql, sqlParam.ToArray(), EffentNextType.ExcuteEffectRows));
}
return DbHelperSQL.ExecuteSqlTran(ListComd);
}
/// <summary>
/// updateList 事务增加
/// </summary>
/// <param name="ID">主键id</param>
/// <returns>int</returns>
public static int Insert<T>(List<T> List, string ID)
{
List<CommandInfo> ListComd = new List<CommandInfo>();
List<KeyValuePair<string, object>> listparam;
//CommandInfo Model = new CommandInfo();
List<MySqlParameter> sqlParam;
MySqlParameter param;
string sql = "";
foreach (var item in List)
{
listparam = new List<KeyValuePair<string, object>>();
sqlParam = new List<MySqlParameter>();
sql = item.ToAddSql(ID, ref listparam);
foreach (var Keyvalue in listparam)
{
//param = new MySqlParameter(Keyvalue.Key, GetDbType(Keyvalue.Value.GetType()));
param = new MySqlParameter(Keyvalue.Key, Keyvalue.Value);
//param.Value = Keyvalue.Value;
sqlParam.Add(param);
}
ListComd.Add(new CommandInfo(sql, sqlParam.ToArray(), EffentNextType.ExcuteEffectRows));
}
return DbHelperSQL.ExecuteSqlTran(ListComd);
}
/// <summary>
/// 获取类型
/// </summary>
/// <returns></returns>
private static MySqlDbType GetDbType(Type t)
{
if (t==typeof(string))
{
return MySqlDbType.String;
}
if (t==typeof(int))
{
return MySqlDbType.Int32;
}
if (t==typeof(bool))
{
return MySqlDbType.Int16;
}
if (t==typeof(DateTime))
{
return MySqlDbType.DateTime;
}
return MySqlDbType.String;
}

C# 数据库数据动态插入(反射)的更多相关文章

  1. Java实现PDF和Excel生成和数据动态插入以及导出

    一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  2. Prometheus时序数据库-数据的插入

    Prometheus时序数据库-数据的插入 前言 在之前的文章里,笔者详细的阐述了Prometheus时序数据库在内存和磁盘中的存储结构.有了前面的铺垫,笔者就可以在本篇文章阐述下数据的插入过程. 监 ...

  3. postgresql 存储过程动态插入数据 2

    最近学习postgresql,正一个小活要用上,所以就开始学习了!然而,学习的过程极其艰辛,但却也充满了乐趣. 一般来说数据库的操作不外如何增,删,改,查,而首要的就是要添加数据到数据库中,因为以前的 ...

  4. ThinkPHP增加数据库字段后插入数据为空的解决办法

    今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...

  5. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  6. C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

    #region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...

  7. C#中几种数据库的大数据批量插入

    C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插 ...

  8. C#:几种数据库的大数据批量插入

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  9. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

随机推荐

  1. 基于Vue-cli 快速搭建项目

    Vue-cli可以快速帮助我们创建一个项目,这是官方给我们提供的脚手架.下面我说一下vue-cli的使用方法. 一.准备工作 在使用vue-cli时,首先需要安装nodejs,npm,其次需全局安装v ...

  2. Trips CodeForces - 1037E(思维dfs)

    题意: 就是几个人去旅游,组队的条件是对于某个队员 队里至少有两个是他的朋友,每天早晨都会有一对新人成为朋友 解析: 用set标记互为朋友 a[i] b[i] 表示在第i天早晨 u和v成为朋友 先求最 ...

  3. caffe多任务、多标签

    解决的目标问题:多分类问题,比如车辆的外形和颜色,苹果的大小和颜色:多任务:车牌角点的定位和车牌的颜色.定位在技术上属于回归,车牌颜色判断则属于分类. 技术点 caffe默认是单输入任务单标签的,也就 ...

  4. emoji表情存储到数据库的方法

    方案1:修改数据库编码 为什么我们设置表的的字符类型为utf8却不能存放emoji呢?原来utf8可能是2或3或4个字节,而mysql的utf8是3个字节,存放一个emoji是需要4个字节的,自然不够 ...

  5. Spring MVC 向页面传值-Map、Model和ModelMap

    原文链接:https://www.cnblogs.com/caoyc/p/5635878.html Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndVi ...

  6. linux socat命令

    http://note.youdao.com/noteshare?id=35901183d9ccc09632339ec971fa58dd

  7. 【CSS】盒子模型的计算

    1.标准盒子的尺寸计算 盒子自身的尺寸:内容的宽高+两侧内边距+两侧边框 盒子在页面中占位的尺寸:内容的宽高+两侧内边距+两侧边框+两侧外边距 <!DOCTYPE html> <ht ...

  8. 001. MyBatis+SpringMVC+Spring[重置版]

    说在前面的话 三阶段的课程知识点和细节很多,请假应该杜绝! 课后需抓紧时间复习,提高代码质量和速度! 课程周期和学习课程顺序为:[正常情况下] MyBatis 持久层框架 [2周] SpringMVC ...

  9. css3 :nth-child()选择器的使用

    一.nth-child() 1. nth-child(n):父元素下的第n个子元素,n>0,索引从1开始.不区分子元素类型. 2. nth-child(odd):父元素下的奇数子元素,等同于:n ...

  10. bzoj千题计划290:bzoj3143: [Hnoi2013]游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...