//定义 特性类:

public class MyAttribute : Attribute//自定义注解类判断是否是主键
{
public bool PrimaryKey = false;
public string Type = null;
}

//完成个实体类:

public class Student
{
private int _Id;
[My(PrimaryKey =true,Type ="自动增长")]
public int Id
{
get { return _Id; }
set { _Id = value; }
}
private string _name;
[My(PrimaryKey =false,Type ="名字")]
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _Age;
[My(PrimaryKey = false, Type = "年龄")]
public int Age
{
get { return _Age; }
set { _Age = value; }
}
private string _Remark;
[My(PrimaryKey =false,Type ="优点")]
public string Remark
{
get { return _Remark; }
set { _Remark = value; }
}

public Student(int id,string name,int age,string remark)
{
this._Id = id;
this._name = name;
this._Age = age;
this._Remark = remark;
}

}

//--执行方法:

class Program
{
static void Main(string[] args)
{
Student stu = new Student(1, "张三", 21, "很多的");//实体类
// Insert(stu);//添加
// Update(stu);//修改
SInsert<Student>(stu);
Console.ReadKey();
}
public static void SInsert<T>(T obj) where T : class
{
string Filed = string.Empty;//字段值初始化
string Values = string.Empty;//属性值初始化

Type type = obj.GetType();
//获取类名
string TableName = type.Name;
//获取所有公有属性
PropertyInfo[] info = type.GetProperties();

foreach (PropertyInfo var in info)
{
//取得属性的特性标签,false表示不获取因为继承而得到的标签
object[] attr = var.GetCustomAttributes(false);
if (attr.Length > 0)
{
//从注解数组中取第一个注解(一个属性可以包含多个注解)
MyAttribute myattr = attr[0] as MyAttribute;
if (myattr.PrimaryKey == true)
{
continue;
}
}
Filed += var.Name + ",";
Values += "'" + var.GetValue(obj, null) + "',";
}
Filed = Filed.Substring(0, Filed.Length - 1);
Values = Values.Substring(0, Values.Length - 1);
string sql = "insert into {0}({1}) values({2})";
sql = string.Format(sql, TableName, Filed, Values);
Console.WriteLine(sql);
}
public static void Insert(object obj)
{
PropertyInfo[] moderarr = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
string val = string.Empty;//预先定义返回值,全局变量为空
string filed = string.Empty;//预先定义属性值,全局变量为空
Type type = obj.GetType();
string className = type.Name;//根据 [Type] 属性完成对实体类对象的获取
foreach (PropertyInfo item in moderarr)
{
string PropertyValue = item.GetValue(obj, null).ToString();//预定义一个属性值接收所返回的属性值
Object[] attr = item.GetCustomAttributes(false);//返回自定义特性数组
if (attr.Length > 0)
{
MyAttribute myattr = attr[0] as MyAttribute;
if (myattr.PrimaryKey == true)//利用C#自定义特性 [MyAttrbute] 判断对象是否是主键
{
continue;
}
}
if (item.PropertyType.Name.StartsWith("Int32") || item.PropertyType.Name.StartsWith("Decimal"))//利用属性类型匹配对应元素信息
{
PropertyValue = item.GetValue(obj, null).ToString();//返回指定对象的属性值
val += PropertyValue + ",";
filed += item.Name + ",";
}
if (item.PropertyType.Name.StartsWith("String") || item.PropertyType.Name.StartsWith("Boolean") || item.PropertyType.Name.StartsWith("DateTime"))
{
PropertyValue = item.GetValue(obj, null).ToString();
val += "'" + PropertyValue + "',";
filed += item.Name + ",";
}
}
val = val.TrimEnd(',');//完成对返回值 Values( ? ) 的获取
filed = filed.TrimEnd(',');//完成对属性值insert 表名 ( ? ) 的获取
string sql = "insert into {0} ({1}) values({2})";
sql = string.Format(sql, className, filed, val);//具体的实现语句
Console.WriteLine(sql);
}

public static void Update(object obj)
{
PropertyInfo[] modelarr = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
string val = string.Empty;
string val2 = string.Empty;
string PropertyName = string.Empty;
string PropertyValue = string.Empty;
Type type = obj.GetType();
string className = type.Name;//根据 [Type] 属性完成对实体类对象的获取
foreach (PropertyInfo item in modelarr)
{
PropertyValue = string.Empty;
PropertyName = item.Name;
if (PropertyName.ToLower().Contains("id"))
{
PropertyValue = item.GetValue(obj, null).ToString();
if (item.PropertyType.Name.StartsWith("Int32"))
{
val2 = PropertyName + " = " + PropertyValue;
}
else
{
val2 = PropertyName + " = '" + PropertyValue + "'";
}
continue;
}
if (item.PropertyType.Name.StartsWith("Int32") || item.PropertyType.Name.StartsWith("Decimal"))
{
PropertyValue = item.GetValue(obj, null).ToString();
val += PropertyName + " = " + PropertyValue + ",";
}
if (item.PropertyType.Name.StartsWith("String") || item.PropertyType.Name.StartsWith("Boolean") || item.PropertyType.Name.StartsWith("DateTime"))
{
PropertyValue = item.GetValue(obj, null).ToString();
val += PropertyName + " = '" + PropertyValue + "',";
}
}
val = val.TrimEnd(',');
string sql = "update {0} set {1} where {2}";
sql = string.Format(sql, className, val, val2);//具体的实现语句
Console.WriteLine(sql);

}

public static List<T> Drop<T>(string ProcName)where T :new()
{
//数据库连接字符串
List<T> list = new List<T>();
string strc = System.Configuration.ConfigurationManager.AppSettings["Conn"].ToString();
SqlConnection conn = new SqlConnection(strc);
if (conn.State!=ConnectionState.Open)
{
conn.Open();
}
SqlCommand cmd = new SqlCommand(ProcName, conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataReader rearer = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Type type = typeof(T);
T entity = new T();
while(rearer.Read())
{
foreach (var item in type.GetProperties())
{
item.SetValue(entity, rearer);
}
list.Add(entity);
}
return list;
}
}

____利用C#特性Attribute完成对sql语句的拼接的更多相关文章

  1. 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和  ...

  2. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

  3. 理想中的SQL语句条件拼接方式 (二)

    问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 . 效果 现在有2个类映射数据库的2张表,结构如下: public class User { public int U ...

  4. [转帖]关于Java中SQL语句的拼接规则

    关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...

  5. .net core 利用日志查看ef生成的SQL语句

    EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...

  6. 利用excel办公软件快速拼凑sql语句

    日常工作中经常会收到excel整理好的部门或者人员等数据信息并需要批量更新或者插入到数据库中,常用的办法有导入.脚本拼凑执行等,今天我介绍直接使用excel快速拼凑sql语句的方法 1.update批 ...

  7. 理想中的SQL语句条件拼接方式

    背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...

  8. Java数据库学习之SQL语句动态拼接

    public class UserDaoImpl implements UserDao { @Override public List<User> getUserByPage(PageIn ...

  9. 关于Java中SQL语句的拼接规则

    实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...

随机推荐

  1. Debian 8.x / Ubuntu 16.04.x 搭建 Ghost 教程

    Ghost 是一款使用 Node.js 开发的博客系统,相对于使用 PHP 开发的 WordPress 更轻巧友好,所以本站已经从 WordPress 切换至 Ghost,本文介绍在 Debian 8 ...

  2. Slot使用

    1.组件中有单个或多个未命名slot标签时,如下:<Child><span style=”color:red;”>hello world</span></Ch ...

  3. C#-Database-连接

    using System.Data; using System.Data.SqlClient; //先打开两个类库文件 SqlConnection con = new SqlConnection(); ...

  4. 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!

    今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...

  5. 某神秘公司 RESTful、共用接口、前后端分离、接口约定的实践

    阅读本文大概需要 4.6 分钟. 本文来自 https://juejin.im/post/59eafab36fb9a045076eccc3 前言 随着互联网高速发展,公司对项目开发周期不断缩短,我们面 ...

  6. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...

  7. scws简单中文分词

    demo如下: /** * 中文分词 * @param $keyword * @param $getTop * @param $limit * @return array */ function sp ...

  8. Maven - 在Eclipse中创建Maven项目

    本文的前提条件: windows7-64bit jdk1.8.0 Maven-3.5.0 1- 更新Eclipse中Maven配置 1.1- 修改Eclipse根目录下eclipse.ini文件 D: ...

  9. python基础-列表(7)

    一.列表格式 列表名 = [列表元素1,列表元素2,列表元素3,… ] 说明: 列表元素之间是有顺序的,也是通过下标表示,第一个元素的小标为0. 列表元素可以不是同种类型,任何类型都行 列表通常当做容 ...

  10. 使用 SonarQube 来分析 .NET Core 项目代码问题

    0.介绍 Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目. Sonar 是一个用于代 ...