1.windows下mysql的表名大小写区分 :

一搜差不多都是

打开my.ini

[mysqld]
lower_case_table_names=0

但是这么已设置,mysql服务都启动不起来。mysql版本5.7.19。

但设置成lower_case_table_names=2就没问题了,表名区分了大小写。

lower_case_table_names=0应该是Linux下的设置方式吧?具体我也没时间去实验了。

2.话说离开百度,某些人就不会写代码了。也难怪,现在要求开发速度高,哪还有那么多人去潜心学习基础知识。但很多网上的代码是有问题的,也许各位也都在实际测试中发现了,我就举个例子。

就拿C#的DataTable对象转List<>集合的代码,网上一搜千篇一律,注释都没变:

public static List<T> ToList<T>(this DataTable dt) where T : class, new()  
    {  
        //创建一个属性的列表    
        List<PropertyInfo> prlist = new List<PropertyInfo>();  
        //获取TResult的类型实例  反射的入口    
  
        Type t = typeof(T);  
  
        //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表     
        Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });  
  
        //创建返回的集合    
  
        List<T> oblist = new List<T>();  
  
        foreach (DataRow row in dt.Rows)  
        {  
            //创建TResult的实例    
            T ob = new T();  
            //找到对应的数据  并赋值    
            prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });  
            //放入到返回的集合中.    
            oblist.Add(ob);  
        }  
        return oblist;  
    }

甚至更简单:

public static IList<T> ConvertToModel(DataTable dt)
        {

            IList<T> ts = new List<T>();// 定义集合
            Type type = typeof(T); // 获得此模型的类型
            string tempName = "";
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T(); 
                PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;
                    if (dt.Columns.Contains(tempName))
                    {
                        if (!pi.CanWrite) continue;
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                ts.Add(t);
            }
            return ts;
        }

他们最大的问题,就是忽略了datetime类型的处理。因为windows操作系统日期格式设置的差异,导致日期时间格式的强制转换会有问题,有时碰巧会转换成功,但有时转换结果就是0001-00-00,

这是第一段代码稍作修改后的,处理比较简单,仅供参考:

                prlist.ForEach(p => {
                    if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null);//如果是日期时间类型,不能这么草率的赋值!网络上的代码漏洞很多! 
                    //日期时间类型的处理 
                    try
                    {
                        if (p.PropertyType == typeof(DateTime) || p.PropertyType == typeof(DateTime?))
                        {
                            DateTime _dt;
                            try
                            {
                                _dt = DateTime.FromOADate(double.Parse(row[p.Name].ToString()));
                            }
                            catch
                            {
                                _dt = Convert.ToDateTime(row[p.Name].ToString());
                            }

                            p.SetValue(ob, _dt, null);
                        }
                    }
                    catch { }

                });

 再啰嗦一句,什么年代了,为毛还要用DataTable这种对象?弱类型的集合现在很多场合下用起来都很费劲,少不了各种判断和转换。某些喜欢用dataTable的人,不是因为DataTable好用,而是他不会用别的,见过一个大哥,不把集合转成dataTable都不会绑数据源,还能说什么呢?

posted on 2017-12-25 12:26  王悟饭  阅读(102)  评论(0编辑  收藏  举报