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 = ,
公共字段 = ,
非公字段 = ,
公共属性 = ,
非公属性 = ,
属性可读 = ,
属性可写 = ,
Default = + +
}
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 != || (null != ext && ext.Count != ))
{
//删除忽略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 - , );
} 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 ( != 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 - , );
vals.Replace(",", ")", vals.Length - , ); 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;
}
}
}
orm4sqlite的更多相关文章
随机推荐
- PhoneGap 的存储 API_localStorage 和 sessionStorage
一.介绍 1.为了替代Cookile这门古老的客户端存储技术,Html5的WEB Storage Api 提供了俩中在 客户端存储数据库的方法:localStorage 和 sessionStorag ...
- 请求是如何传递给StandardEngine的?
将请求的传递过程分解学习. CoyoteAdapter将中持有Connector的引用,所以在Coyote这个类中Connector查找它所属的StandardService,而StandardSer ...
- SpringMVC(1)
1.简要说明: Spring为展现层提供的基于MVC设计理念的优秀web框架,目前主流的框架 Spring3.0以后全面超越Struts2,成为最优秀的MVC框架 Spring MVC通过一套MVC注 ...
- 优化器,sgd,adam等
https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于 ...
- tensorflow的一些函数
1.tf.constant(value,dtype=None,shape=None,name='Const') 注意这个函数创造的是一个常数tensor,而不是一个具体的常数 value:即可以是li ...
- mac端抓包工具——Charles使用
一.简介 Charles(http://www.charlesproxy.com/)是在Mac 下常用的截取网络封包的工具.Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问 ...
- CPP-基础:信号量
windows api 多线程---信号量 信号量(Semaphore)和互斥量一样,属于内核对象.它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少1,从而避免其它线程请求资源.当该 ...
- 使用document对象操作cookie
1. 使用document对象的cookie属性,可以让你读取.添加和更新文档(当期HTML)所关联的cookie. 2. 当你读取document.cookie时,会得到当期文档的所有cookie. ...
- 关键字: simpledateformat24小时 格式串
SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出 Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 M ...
- 用js写三个数,让三个数从小到大排列
console.log('请输入三个数:'); let num1 = readline.question() - 0; let num2 = readline.question() - 0; let ...