//--------------------------------------------------------------------------
//
// 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的更多相关文章

随机推荐

  1. itext-2.1.7.jar

    iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. ...

  2. PowerDNS简单教程(2):功能篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇(本篇) Po ...

  3. Mybatis批量插入及传参问题

    先看需求:将报文对象Message批量插入分库分表的Oracle数据库中 一般如果直接传入List的话,需要加上parameterType="java.util.List" ,然后 ...

  4. PHP----练习-----新闻管理----增删改查

    练习-----新闻管理 题目要求如下: 做法: [1]建数据库 [2]封装类文件--------DBDA.class.php <?php class DBDA { public $fuwuqi= ...

  5. Css3 实现关键帧动画

    <div class="person"> </div> <script> var str1 = "@keyframes move{&q ...

  6. HashMap和Hashtable的详细区别

    1.Hashtable是线程安全,HashMap是非线程安全 HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用 ...

  7. CToolBarCtrl工具栏设置总结(转)

    (一)工具条控制的主要功能 所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮.检查盒按钮.无线按 钮等.工具条对象类派生于主窗口架框类CframeWnd或CMDIFrame ...

  8. AWS backup

    shadowsocks ssserver -c /etc/shadowsocks/config.json start/stop/reset

  9. JSP Cookie 处理

    Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务器脚本发送一系列cook ...

  10. Oracle作业4-函数

    一.在数据库中的emp和dept表中做如下查询: 1.列出所有分析师(ANALYST)的姓名.编号和部门 SELECT ENAME,EMPNO,E.DEPTNO,DNAME FROM EMP E,DE ...