反射生成T-SQL语句,欢迎大家批评指正,有待改进
2011-08-24 21:24
429 查看
/// <summary>
/// 生成SQL语句
/// </summary>
/// <typeparam name="T"></typeparam>
public static class TSQLHelper<T> where T : new()
{
static Dictionary<string, Dictionary<CRUD, string>> tableCRUD = new Dictionary<string, Dictionary<CRUD, string>>();
public static string GetInsertStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.insert];
}
public static string GetUpdateStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.update];
}
public static string GetDeleteStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.delete];
}
public static string GetSelectStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.select];
}
public static T GetOneByWhere(string where)
{
DataTable dtb = DBHelper.GetDataTable("SELECT * FROM " + typeof(T).Name + " WHERE " + where);
T entity = new T();
Type t = entity.GetType();
if (dtb.Rows.Count > 0)
{
foreach (DataColumn item in dtb.Columns)
{
MemberInfo[] ms = t.GetMembers(BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);
t.InvokeMember(item.ColumnName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public , null, entity, new object[] { dtb.Rows[0][item.ColumnName] });
}
return entity;
}
return default(T);
}
static private Dictionary<CRUD, string> GetCRUDStatement(T entity)
{
//if (!tableCRUD.ContainsKey(t.Name))
//{
string insert = "INSERT INTO {0}(";
string value = " VALUES(";
string update = "UPDATE {0} SET ";
string where = " WHERE ";
string delete = "DELETE FROM {0} ";
string select = "SELECT * FROM {0} ";
Type t = typeof(T);
MemberInfo[] fis = t.GetMembers(BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
var result = from fi in fis where fi.MemberType == MemberTypes.Property && fi.DeclaringType.Name == t.Name select fi;
insert = string.Format(insert, t.Name);
update = string.Format(update, t.Name);
delete = string.Format(delete, t.Name);
select = string.Format(select, t.Name);
object obj = null;
Type fieldType = null;
foreach (var item in result)
{
obj = t.InvokeMember(item.Name, BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, entity, null);
if (obj == null)
continue;
insert = string.Concat(new object[] { insert, item.Name, "," });
fieldType = obj.GetType();
object[] pk = item.GetCustomAttributes(typeof(PrimaryKey), false);
if (fieldType.FullName == "System.Int16" || fieldType.FullName == "System.Int32" | fieldType.FullName == "System.Int64" | fieldType.FullName == "System.Single" || fieldType.FullName == "System.Double" || fieldType.FullName == "System.Boolean")
{
value = string.Concat(new object[] { value, obj, "," });
if (pk != null)
if (pk.Length > 0)
{
if (Convert.ToBoolean(pk[0].GetType().InvokeMember("IsPrimaryKey", BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, pk[0], null)) == true)
where = string.Concat(where, item.Name, "=", obj, " and ");
}
else
{
update = string.Concat(new object[] { update, item.Name, "=", obj, "," });
}
}
else
{
value = string.Concat(new object[] { value, "'", obj, "'", "," });
if (pk != null)
if (pk.Length > 0)
{
if (Convert.ToBoolean(pk[0].GetType().InvokeMember("IsPrimaryKey", BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, pk[0], null)) == true)
where = string.Concat(where, item.Name, "='", obj, "' and ");
}
else
{
update = string.Concat(new object[] { update, item.Name, "=", obj, "," });
}
}
}
insert = insert.Remove(insert.Length - 1);
value = value.Remove(value.Length - 1);
insert = string.Concat(new object[] { insert, ")", value, ")" });
update = update.Remove(update.Length - 1);
where = where.Remove(where.Length - 4);
update = string.Concat(update, where);
delete = string.Concat(delete, where);
select = string.Concat(select, where);
Dictionary<CRUD, string> curd = new Dictionary<CRUD, string>();
curd.Add(CRUD.insert, insert);
curd.Add(CRUD.delete, delete);
curd.Add(CRUD.update, update);
curd.Add(CRUD.select, select);
//tableCRUD.Add(t.Name, curd);
return curd;
//}
//return tableCRUD[t.Name];
}
}
enum CRUD
{
insert,
update,
delete,
select
}
/// 生成SQL语句
/// </summary>
/// <typeparam name="T"></typeparam>
public static class TSQLHelper<T> where T : new()
{
static Dictionary<string, Dictionary<CRUD, string>> tableCRUD = new Dictionary<string, Dictionary<CRUD, string>>();
public static string GetInsertStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.insert];
}
public static string GetUpdateStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.update];
}
public static string GetDeleteStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.delete];
}
public static string GetSelectStatement(T entity)
{
return GetCRUDStatement(entity)[CRUD.select];
}
public static T GetOneByWhere(string where)
{
DataTable dtb = DBHelper.GetDataTable("SELECT * FROM " + typeof(T).Name + " WHERE " + where);
T entity = new T();
Type t = entity.GetType();
if (dtb.Rows.Count > 0)
{
foreach (DataColumn item in dtb.Columns)
{
MemberInfo[] ms = t.GetMembers(BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);
t.InvokeMember(item.ColumnName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public , null, entity, new object[] { dtb.Rows[0][item.ColumnName] });
}
return entity;
}
return default(T);
}
static private Dictionary<CRUD, string> GetCRUDStatement(T entity)
{
//if (!tableCRUD.ContainsKey(t.Name))
//{
string insert = "INSERT INTO {0}(";
string value = " VALUES(";
string update = "UPDATE {0} SET ";
string where = " WHERE ";
string delete = "DELETE FROM {0} ";
string select = "SELECT * FROM {0} ";
Type t = typeof(T);
MemberInfo[] fis = t.GetMembers(BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
var result = from fi in fis where fi.MemberType == MemberTypes.Property && fi.DeclaringType.Name == t.Name select fi;
insert = string.Format(insert, t.Name);
update = string.Format(update, t.Name);
delete = string.Format(delete, t.Name);
select = string.Format(select, t.Name);
object obj = null;
Type fieldType = null;
foreach (var item in result)
{
obj = t.InvokeMember(item.Name, BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, entity, null);
if (obj == null)
continue;
insert = string.Concat(new object[] { insert, item.Name, "," });
fieldType = obj.GetType();
object[] pk = item.GetCustomAttributes(typeof(PrimaryKey), false);
if (fieldType.FullName == "System.Int16" || fieldType.FullName == "System.Int32" | fieldType.FullName == "System.Int64" | fieldType.FullName == "System.Single" || fieldType.FullName == "System.Double" || fieldType.FullName == "System.Boolean")
{
value = string.Concat(new object[] { value, obj, "," });
if (pk != null)
if (pk.Length > 0)
{
if (Convert.ToBoolean(pk[0].GetType().InvokeMember("IsPrimaryKey", BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, pk[0], null)) == true)
where = string.Concat(where, item.Name, "=", obj, " and ");
}
else
{
update = string.Concat(new object[] { update, item.Name, "=", obj, "," });
}
}
else
{
value = string.Concat(new object[] { value, "'", obj, "'", "," });
if (pk != null)
if (pk.Length > 0)
{
if (Convert.ToBoolean(pk[0].GetType().InvokeMember("IsPrimaryKey", BindingFlags.GetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, pk[0], null)) == true)
where = string.Concat(where, item.Name, "='", obj, "' and ");
}
else
{
update = string.Concat(new object[] { update, item.Name, "=", obj, "," });
}
}
}
insert = insert.Remove(insert.Length - 1);
value = value.Remove(value.Length - 1);
insert = string.Concat(new object[] { insert, ")", value, ")" });
update = update.Remove(update.Length - 1);
where = where.Remove(where.Length - 4);
update = string.Concat(update, where);
delete = string.Concat(delete, where);
select = string.Concat(select, where);
Dictionary<CRUD, string> curd = new Dictionary<CRUD, string>();
curd.Add(CRUD.insert, insert);
curd.Add(CRUD.delete, delete);
curd.Add(CRUD.update, update);
curd.Add(CRUD.select, select);
//tableCRUD.Add(t.Name, curd);
return curd;
//}
//return tableCRUD[t.Name];
}
}
enum CRUD
{
insert,
update,
delete,
select
}
相关文章推荐
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- 反射+注释,根据实体类对象生成SQL语句工具类
- 常用SQL语句整理中,欢迎大家补充....
- 反射的学习笔记--sql语句生成
- 通过java反射实现对javabean生成各种sql语句
- 自己写的一个基于数组实现的栈,欢迎大家批评指正,共同进步
- (欢迎探讨)取n到m行 SQL,大家帮忙看看第三条语句对不对?
- 模拟Hibernate底层生成SQL语句(反射机制)
- C#反射生成简单sql语句
- 反射生成SQL语句入门
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- 通过自定义注解反射生成SQL语句
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- Afinal数据库模块实现(一)_注释Annotation和反射生成SQL语句
- 利用反射动态生成sql语句
- 反射生成 INSERT 多个对象的 SQL 语句(批量插入)
- 内部UML培训文件,欢迎大家批评指正
- 将本地项目放到Github上(应该可以这么说)[如有错误欢迎大家批评指正]
- 反射生成SQL语句入门
- 计算机中浮点数的存储方式-自己整理,欢迎大家批评指正