sql server and oracle 不同之处只在于:

1·参数@和:

2·自增和序列

RPROM.cs //(写错愕,应该是RPORM)

RPROM.Insert(p1); //需求:DBS中插入一条数据

约定:
类名要和表名一样
字段名和数据库列名一样
主键的名字必须是Id,必须自动递增,int类型

class RupengROM
    {
        /// 插入对象
        internal static void Insert(Object obj)
        {
            //获得类名
            Type type = obj.GetType();
            string className = type.Name;
            //获得除id的所有列名
            PropertyInfo[] properties = type.GetProperties();
            string[] propertyNames = new string[properties.Length - 1]; //存除id的属性名(列名)
            string[] propertyAtNames = new string[properties.Length - 1]; //存除id的属性+@名
            //获得除id的所有参数
            MySqlParameter[] mysqlParameters = new MySqlParameter[properties.Length - 1]; //存除id的参数名
            int i = 0;
            foreach(PropertyInfo property in properties)
            {
                if(property.Name!="Id")
                {
                    propertyNames[i] = property.Name;
                    propertyAtNames[i] = "@" + property.Name;
                    MySqlParameter mysqlParam = new MySqlParameter();
                    mysqlParam.ParameterName = "@" + property.Name;
                    mysqlParam.Value = property.GetValue(obj); //获得指定对象的属性值
                    mysqlParameters[i] = mysqlParam;
                    i++;
                }
            }
            string propertyNamesStr = string.Join(",", propertyNames);
            string propertyAtNamesStr = string.Join(",", propertyAtNames);
            //拼接sql语句
            //insert into T_Person(Name,Age) values(@Name,@Age)
            StringBuilder sb = new StringBuilder();
            sb.Append("insert into T_").Append(className).Append("(").Append(propertyNamesStr).Append(") values(").Append(propertyAtNamesStr).Append(")");
            int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), mysqlParameters);
            string msg = im > 0 ? "插入成功" : "插入失败";
            Console.WriteLine(msg);
        }

/// 根据id查询对象
        internal static Object SelectById(Type type,int id)
        {
            string className = type.Name;
            //拼接sql语句
            //select * from T_Person where Id=@Id
            StringBuilder sb = new StringBuilder();
            sb.Append("select * from T_").Append(className).Append(" where Id=@Id");
            DataTable dt = MySqlHelper.ExecuteQuery(sb.ToString(), new MySqlParameter() { ParameterName = "@Id", Value = id });
            if(dt.Rows.Count<=0)
            {
                return null;
            }
            else if(dt.Rows.Count>1)
            {
                throw new Exception("数据库发生异常,存在id=" + id + "的重复数据");
            }
            else
            {
                DataRow row = dt.Rows[0];
                Object obj = Activator.CreateInstance(type); //动态创建指定类型的实例
                PropertyInfo[] propertyInfoes = type.GetProperties();
                foreach(PropertyInfo propertyInfo in propertyInfoes)
                {
                    string propertyName = propertyInfo.Name; //属性名就是列名
                    object value = row[propertyName];
                    propertyInfo.SetValue(obj, value); //设置指定对象的属性值
                }
                return obj;
            }
        }

/// 根据Id更新实例
        internal static void UpdateById(Object obj)
        {
            //获得类名
            Type type = obj.GetType();
            string className = type.Name;
            //获得除id的列名变化形式 "Name=@Name"
            PropertyInfo[] propertyInfoes = type.GetProperties();
            string[] propertyChanges = new string[propertyInfoes.Length - 1]; //存除id的属性变化形式
            MySqlParameter[] mysqlParameters = new MySqlParameter[propertyInfoes.Length]; //存sql参数
            int i = 0;
            foreach(PropertyInfo propertyInfo in propertyInfoes)
            {
                string propertyName = propertyInfo.Name;
                if (propertyName != "Id")
                {
                    propertyChanges[i] = propertyName + "=@" + propertyName;
                    i++;
                }
                MySqlParameter mysqlParam = new MySqlParameter();
                mysqlParam.ParameterName = "@" + propertyName;
                mysqlParam.Value = propertyInfo.GetValue(obj);
                mysqlParameters[i] = mysqlParam;
            }
            string propertyChangesStr = string.Join(",", propertyChanges);

//拼接sql语句
            //update T_Person set Name=@Name,Age=@Age where Id=@Id
            StringBuilder sb = new StringBuilder();
            sb.Append("update T_").Append(className).Append(" set ").Append(propertyChangesStr).Append(" where Id=@Id");
            int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), mysqlParameters);
            string msg = im > 0 ? "更新成功" : "更新失败";
            Console.WriteLine(msg);
        }

/// 根据id删除
        internal static void DeleteById(Type type, int id)
        {
            //获得类名
            string className = type.Name;

//拼接sql语句
            //delete from T_Person where Id=@Id
            StringBuilder sb = new StringBuilder();
            sb.Append("delete from T_").Append(className).Append(" where Id=@Id");
            int im = MySqlHelper.ExecuteNonQuery(sb.ToString(), new MySqlParameter() { ParameterName = "@Id", Value = id });
            string msg = im > 0 ? "删除成功" : "删除失败";
            Console.WriteLine(msg);
        }
    }

反射ORM 三层(for sql server/mysql)的更多相关文章

  1. SQL Server | Mysql 对表的unique 的实现方式

    在ANSI SQL 标准中unique 有两种实现方式 1.是可以插入多个空值.也就是说多个null值看成是互不相同的. 2.是只可以插入一个空值,也主是说把所有的空值看也是相同的. 在SQL Ser ...

  2. 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接

    前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...

  3. SQL Server,MySQL,Oracle三者的区别

    SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...

  4. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  5. Bootstrap + AngularJS+ Ashx + SQL Server/MySQL

    去年年底12月,为适应移动端浏览需求,花了1个月时间学习Bootstrap,并将公司ASP网站重构成ASP.NET. 当时采取的网站架构: Bootstrap + jQuery + Ashx + SQ ...

  6. 反射ORM 三层(for oracle)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...

  7. iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】

    iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 <!-- Oracle SE ...

  8. SQL Server Mysql primary key可更新性分析

    SQL Server: 一般来说SQL Server 中表的主键是支持更新操作的.但是如果这个主键是由identity(1,1)这类的方式生成的话它是不可更新的. Mysql : Mysql 中表的主 ...

  9. SQL Server Mysql 对null值理解的不同

    在说到对null值的理解主要是用unique来体现的.也是说null在unique约束看来是一个值还是多个值的问题. 还是开始实验吧. MYSQL create table t(x int ,cons ...

随机推荐

  1. java中如何高效判断数组中是否包含某个特定的值

    四种不同方式检查数组是否包含某个值 使用List: public static boolean useList(String[] arr, String targetValue) { return A ...

  2. INSPIRED启示录 读书笔记 - 第3章 产品管理与项目管理

    互联网让两者变得不同 在传统的零售软件领域,产品经理常常兼任项目经理的工作,随着互联网的发展,两者的职责区别也越来越明显 产品管理的职责是探索(定义)有价值的.可用的.可行的产品 项目管理的职责是关注 ...

  3. 算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)

    给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1  直接返回 长度2 将头节点删除 长度3 ...

  4. 【codevs1069】关押罪犯[noip2010](并查集)

    题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...

  5. JavaWeb -- Servlet Filter 过滤器

    1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...

  6. java连接SQL数据库(JDBC)相关设置

    2016-06-14 一.SQL server中的相关设置(以sql server 2012 版本为例) 建立一个SQL server 身份认证的服务器登录名 首先启动SQL客户端,以windows身 ...

  7. Delphi调用Java类

    1. Delphi XE7调用Java Class,JAR http://www.th7.cn/Program/delphi/201409/277888.shtml ZC: 文章中又提到:http:/ ...

  8. 智课雅思词汇---十七、前綴il-, in-, ir-, im-有什麼關係

    智课雅思词汇---十七.前綴il-, in-, ir-, im-有什麼關係 一.总结 一句话总结:这几个长得非常像,并且意思也非常像 1.前綴il-, in-, ir-, im-是什麼意思? 前缀:i ...

  9. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

  10. CodeForces 444C 线段树

    想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...