• orm4sqlite


    //-------------------------------------------------------------------------- 
    //  
    //  Copyright (c) BUSHUOSX.  All rights reserved.  
    //  
    //  File: Orm4Sqlite.cs 
    //
    //  Version:1.0.0.0
    //
    //  Datetime:20170811
    // 
    //---------------------------------------------------------------------------
    
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    using System.Data.SQLite;
    using System.Data;
    
    namespace BUSHUOSX.Helper
    {
        public class Orm4Sqlite
        {
            [Flags]
            public enum MemberFlags
            {
                None = 0,
                公共字段 = 1,
                非公字段 = 2,
                公共属性 = 4,
                非公属性 = 8,
                属性可读 = 16,
                属性可写 = 32,
                Default = 1 + 4 + 16
            }
            public static Dictionary<string, object> GetFiledAndPropetyValue(object obj, HashSet<string> ignore = null, MemberFlags flags = MemberFlags.Default)
            {
                if (null == obj)
                {
                    return null;
                }
    
                Dictionary<string, object> tmp = new Dictionary<string, object>();
    
                //var fields = getFields(obj.GetType(), flags);
                foreach (var item in getFields(obj.GetType(), flags))
                {
                    if (null != ignore && ignore.Contains(item.Name))
                    {
                        continue;
                    }
                    tmp[item.Name] = item.GetValue(obj);
                }
    
                //var properties = getProperties(obj.GetType(), flags);
                foreach (var item in getProperties(obj.GetType(), flags))
                {
                    if (null != ignore && ignore.Contains(item.Name))
                    {
                        continue;
                    }
                    tmp[item.Name] = item.GetValue(obj, null);
                }
    
                return tmp;
            }
    
            private static List<MemberInfo> GetFiledsAndPropetys(Type type, HashSet<string> ignore = null, MemberFlags flags = MemberFlags.Default)
            {
                List<MemberInfo> result = new List<MemberInfo>();
                foreach (var item in getFields(type, flags))
                {
                    if (null != ignore && ignore.Contains(item.Name))
                    {
                        continue;
                    }
                    result.Add(item);
                }
                foreach (var item in getProperties(type, flags))
                {
                    if (null != ignore && ignore.Contains(item.Name))
                    {
                        continue;
                    }
                    result.Add(item);
                }
                return result;
            }
    
            private static List<PropertyInfo> getProperties(Type type, MemberFlags flags)
            {
                List<PropertyInfo> tmp = new List<PropertyInfo>();
                BindingFlags bfs = BindingFlags.Default;
    
                if ((flags & MemberFlags.公共属性) == MemberFlags.公共属性) bfs |= BindingFlags.Public;
                if ((flags & MemberFlags.非公属性) == MemberFlags.非公属性) bfs |= BindingFlags.NonPublic;
                if (bfs != BindingFlags.Default)
                {
                    bfs |= BindingFlags.Instance | BindingFlags.Static;
                    var properties = type.GetProperties(bfs);
                    foreach (var item in properties)
                    {
                        if ((flags & MemberFlags.属性可读) == MemberFlags.属性可读)
                        {
                            if (!item.CanRead)
                            {
                                continue;
                            }
                        }
                        if ((flags & MemberFlags.属性可写) == MemberFlags.属性可写)
                        {
                            if (!item.CanWrite)
                            {
                                continue;
                            }
                        }
                        tmp.Add(item);
                    }
                }
                return tmp;
            }
    
            private static List<FieldInfo> getFields(Type type, MemberFlags flags)
            {
                List<FieldInfo> tmp = new List<FieldInfo>();
                BindingFlags bfs = BindingFlags.Default;
                if ((flags & MemberFlags.公共字段) == MemberFlags.公共字段) bfs |= BindingFlags.Public;
                if ((flags & MemberFlags.非公字段) == MemberFlags.非公字段) bfs |= BindingFlags.NonPublic;
                if (bfs != BindingFlags.Default)
                {
                    bfs |= BindingFlags.Instance | BindingFlags.Static;
                    var fileds = type.GetFields(bfs);
                    tmp.AddRange(fileds);
                }
                return tmp;
            }
    
            private static string netType2sqliteType(Type type)
            {
                if (type.IsValueType)
                {
                    if (type == typeof(float) || type == typeof(double))
                    {
                        return "REAL";
                    }
                    if (typeof(DateTime) == type)
                    {
                        return "DATETIME";
                    }
                    return "INTEGER";
                }
    
                if (typeof(string) == type)
                {
                    return "TEXT";
                }
    
    
                return "BLOB";
            }
    
            public static string GenarateCreateTableSql(Type type, MemberFlags flags = MemberFlags.Default, HashSet<string> ignore = null, Dictionary<string, string> ext = null)
            {
                Dictionary<string, Type> clms = new Dictionary<string, Type>();
    
                foreach (var item in getFields(type, flags))
                {
                    clms[item.Name] = item.FieldType;
                }
    
                foreach (var item in getProperties(type, flags))
                {
                    clms[item.Name] = item.PropertyType;
                }
    
                StringBuilder sb = new StringBuilder();
                if (clms.Count != 0 || (null != ext && ext.Count != 0))
                {
                    //删除忽略colume
                    if (null != ignore)
                    {
                        foreach (var item in ignore)
                        {
                            clms.Remove(item);
                        }
                    }
    
                    sb.AppendFormat(@"CREATE TABLE {0} (", type.Name);
                    foreach (var item in clms)
                    {
                        //sb.AppendFormat(@"{0} {1},", item.Key, item.Value.ToString());//第二项为sqlite数据类型
                        sb.AppendFormat(@"{0} {1},", item.Key, netType2sqliteType(item.Value));
                    }
    
                    if (null != ext)
                    {
                        foreach (var item in ext)
                        {
                            sb.AppendFormat(@"{0} {1},", item.Key, item.Value);
                        }
                    }
    
                    sb.Replace(",", ")", sb.Length - 1, 1);
                }
    
                return sb.ToString();
            }
    
            public static string GenarateInsertSql(Type type, MemberFlags flags = MemberFlags.Default, HashSet<string> ignore = null, HashSet<string> ext = null)
            {
                HashSet<string> columns = new HashSet<string>();
    
                //获取字段
                foreach (var item in getFields(type, flags))
                {
                    columns.Add(item.Name);
                }
    
                //获取属性
                foreach (var item in getProperties(type, flags))
                {
                    columns.Add(item.Name);
                }
    
                if (null != ignore)
                {
                    foreach (var item in ignore)
                    {
                        columns.Remove(item);
                    }
                }
                if (null != ext)
                {
                    foreach (var item in ext)
                    {
                        columns.Add(item);
                    }
                }
    
                StringBuilder sql = new StringBuilder();
    
                if (0 != columns.Count)
                {
                    sql.AppendFormat(@"INSERT INTO {0} (", type.Name);
    
                    StringBuilder clms = new StringBuilder();
                    StringBuilder vals = new StringBuilder();
                    foreach (var item in columns)
                    {
                        clms.AppendFormat("{0},", item);
                        vals.AppendFormat("@{0},", item);
                    }
                    clms.Replace(",", ") VALUES (", clms.Length - 1, 1);
                    vals.Replace(",", ")", vals.Length - 1, 1);
    
                    sql.Append(clms).Append(vals);
                }
    
                return sql.ToString();
            }
    
            public struct ColumnInfo
            {
                public int cid;
                public string name;
                public string type;
                public bool notnull;
                public object dflt_value;
                public bool pk;
            }
            public static List<ColumnInfo> GetColumnInfoFromTable(string conString, string tableName)
            {
                List<ColumnInfo> result = null;
                SQLiteConnection con = new SQLiteConnection(conString);
                try
                {
                    SQLiteCommand cmd = new SQLiteCommand(con);
                    cmd.CommandText = string.Format(@"pragma table_info({0})", tableName);
    
                    con.Open();
    
                    using (var reader = cmd.ExecuteReader())
                    {
                        result = new List<ColumnInfo>();
                        while (reader.Read())
                        {
                            result.Add(new ColumnInfo()
                            {
                                cid = Convert.ToInt32(reader["cid"]),
                                name = reader["name"] as string,
                                notnull = Convert.ToBoolean(reader["notnull"]),
                                type = reader["type"] as string,
                                dflt_value = reader["dflt_value"],
                                pk = Convert.ToBoolean(reader["pk"]),
                            });
                        }
                    }
                }
                catch (Exception e)
                {
                    //throw;
                }
                con.Close();
    
                return result;
            }
            public static List<T> GetDataFromTable<T>(string conString,string selectSql)
                where   T:new ()
            {
                List<T> result = null;
                SQLiteConnection con = new SQLiteConnection(conString);
                try
                {
                    SQLiteDataAdapter sda = new SQLiteDataAdapter(selectSql, con);
                    DataTable dt = new DataTable();
                    con.Open();
                    var i = sda.Fill(dt);
                    List<PropertyInfo> validProperty = new List<PropertyInfo>();
                    foreach (var item in dt.Columns)
                    {
                        var p = typeof(T).GetProperty(item.ToString());
                        if (null != p)
                        {
                            var x =p.Attributes;
                            var y = p.GetCustomAttributes(false);
                            var z = p.GetCustomAttributesData();
                            validProperty.Add(p);
                        }
                    }
                    result = new List<T>();
                    foreach (DataRow row in dt.Rows)
                    {
                        T t = new T();
                        foreach (var vp in validProperty)
                        {
                            vp.SetValue(t, row[vp.Name], null);
                        }
                        result.Add(t);
                    }
    
                    dt.Clear();
                    sda.Dispose();
                }
                catch (Exception e)
                {
                }
                con.Close();
                return result;
            }
        }
    }
  • 相关阅读:
    基于maven的profile实现动态选择配置文件
    [公告]博客迁移通知
    itellij idea导入web项目并部署到tomcat
    DWR实现后台推送消息到web页面
    DWR实现扫一扫登录功能
    微信企业号开发[目录]
    微信企业号开发[一]——创建应用
    微信企业号开发[三]——调用微信接口
    微信企业号开发[二]——获取用户信息
    JavaScript编码规范指南
  • 原文地址:https://www.cnblogs.com/bushuosx/p/7343014.html
Copyright © 2020-2023  润新知