• C# 数据库数据动态插入(反射)


     /// <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 = 0; 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 = 0; //非空值类型的默认值
                            }
                        }
                       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) == 1;
                            }
                        }
           
                        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 = 0; 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(0, 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 = 0; 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(0, keys.LastIndexOf(','));
                    values = values.Substring(0, 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 = 0; 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(0, keys.LastIndexOf(','));
                    values = values.Substring(0, 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 = 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.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 0;
                }
                else if (type.GetProperty(ID).GetValue(Model, null).ToString() == "0")
                {
                    return 0;
                }
                for (int i = 0; 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(0, filedStr.ToString().LastIndexOf(',')));
                commandText.Append(" where " + ID + "=@" + ID);
                object obj2 = DbHelperSQL.ExecuteSql(commandText.ToString(), param.ToArray());
                if (obj2 == null)
                {
                    return 0;
                }
                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;
           }
  • 相关阅读:
    Android 节日短信送祝福(UI篇:3-选择短信与发送短信的Activity的实现)
    Android 节日短信送祝福(功能篇:2-短信历史记录Fragment的编写)
    Android 节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)
    Android AIDL 小结
    Android 异步更新UI-线程池-Future-Handler实例分析
    Android 利用线程运行栈StackTraceElement设计Android日志模块
    Android OkHttp网络连接封装工具类
    Android OKHttp源码解析
    Android开发人员不得不收集的代码(持续更新中)
    Android 为开发者准备的最佳 Android 函数库(2016 年版)
  • 原文地址:https://www.cnblogs.com/daxiongblog/p/7066843.html
Copyright © 2020-2023  润新知