C# SQL封装(四)

本篇接C# SQL封装(三)

在其功能上继续扩展 改操作 , 让我们开始吧。。。。。

一 : 构建T-SQL语句(在SQL_Structure.cs中添加一个方法 UPDATE_T_SQL , 用于构建update的T-SQL)

        /// <summary>
        /// 更新一条数据的T-SQL构成(以id号来删除)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model">原始model</param>
        /// <param name="model_change">更改后的model</param>
        /// <returns></returns>
        public static string UPDATE_T_SQL<T>(T model , T model_change) where T : BaseModel
        {
            Type model_type = model.GetType();
            Type model_change_type = model_change.GetType();
            if (model_type.Name == model_change_type.Name)
            {
                string base_update = @"update [{0}] set {1} where {2} = @{3}";
                string[] arr = model_type.Name.Split(new char[] { ‘.‘ });
                string table_name = arr[arr.Length - 1];//获得表的名称
                PropertyInfo[] p_intos = model_type.GetProperties();
                PropertyInfo item = null;
                PropertyInfo item_change = null;
                string item_value = string.Empty;
                string item_change_value = string.Empty;
                StringBuilder update_set = null;
                for (int i = 0; i < p_intos.Length; i++)
                {
                    item = p_intos[i];
                    item_change = model_change_type.GetProperty(item.Name);
                    item_value = item.GetValue(model, null).ToString();
                    item_change_value = item_change.GetValue(model_change, null).ToString();
                    if (item.Name == "id")
                    {
                        //比较id值是否一致
                        if (item_value != item_change_value)
                        {
                            throw new Exception(
                                string.Format("model类 id : {0} 与model_change类id:{1} 不一致,请确保是同一条数据",
                                    item_value,
                                    item_change_value
                                )
                                );
                        }
                    }
                    else
                    {
                        if (item_value != item_change_value)
                        {
                            if (update_set == null) update_set = new StringBuilder();
                            update_set.Append(
                                string.Format( @" {0} = @{1}," , item.Name , item.Name )
                                );
                        }
                    }
                }
                if (update_set != null)
                {
                    return string.Format( base_update,
                        table_name,
                        update_set.ToString().Substring(0, update_set.ToString().Length - 1),
                        "id",
                        "id"
                        );
                }
                else
                {
                    return string.Empty;//不存在更新
                }
            }
            else
            {
                throw new Exception(
                    string.Format("model类 : {0} 与model_change类 :{1} 不匹配",
                        model_type.Name ,
                        model_change_type.Name
                        )
                    );
            }
        }

二 : 构建SqlParameter参数 (在SqlParameter_Structure.as中添加方法UPDATE_T_SQL)

        /// <summary>
        /// 构建T-SQL参数 UPDATE
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model">原model</param>
        /// <param name="model_change">更改后model</param>
        /// <returns></returns>
        public static SqlParameter[] UPDATE_T_SQL<T>(T model, T model_change) where T : BaseModel
        {
            Type model_type = model.GetType();
            Type model_change_type = model_change.GetType();
            if (model_type.Name == model_change_type.Name)
            {
                PropertyInfo[] p_intos = model_type.GetProperties();
                PropertyInfo item = null;
                PropertyInfo item_change = null;
                string item_value = string.Empty;
                string item_change_value = string.Empty;
                List<SqlParameter> sql_param = null;
                SqlParameter cell = null;
                bool is_change_model = false;//是否有字段进行了更改
                for (int i = 0; i < p_intos.Length; i++)
                {
                    item = p_intos[i];
                    item_change = model_change_type.GetProperty(item.Name);
                    item_value = item.GetValue(model, null).ToString();
                    item_change_value = item_change.GetValue(model_change, null).ToString();
                    if (item.Name == "id")
                    {
                        if (item_value != item_change_value)
                        {
                            throw new Exception(
                                string.Format("model类 id : {0} 与model_change类id:{1} 不一致,请确保是同一条数据",
                                    item_value,
                                    item_change_value
                                )
                                );
                        }
                        else
                        {
                            if (sql_param == null) sql_param = new List<SqlParameter>();
                            cell = new SqlParameter(item.Name, SqlParameter_Structure.Get_SqlDbType_SqlType(item.PropertyType));
                            cell.Value = item.GetValue(model, null);
                            sql_param.Add(cell);
                        }
                    }
                    else
                    {
                        if (item_value != item_change_value)
                        {
                            if (!is_change_model) is_change_model = true;
                            if (sql_param == null) sql_param = new List<SqlParameter>();
                            cell = new SqlParameter(item_change.Name, SqlParameter_Structure.Get_SqlDbType_SqlType(item_change.PropertyType));
                            cell.Value = item_change.GetValue(model_change, null);//加入改变的值
                            sql_param.Add(cell);
                        }
                    }
                }
                if (is_change_model)
                {
                    return sql_param.ToArray<SqlParameter>();
                }
                else
                {
                    return null;//没有任何字段更改
                }
            }
            else
            {
                throw new Exception(
                    string.Format("model类 : {0} 与model_change类 :{1} 不匹配",
                        model_type.Name,
                        model_change_type.Name
                        )
                    );
            }
        }

测试:

测试代码

//------------------------模拟一条重数据库得到的数据 begin ---------------------------------------
            User kayer_ori = new User();
            kayer_ori.id = 3;
            kayer_ori.name = "kayer";
            kayer_ori.sex = 1;
            kayer_ori.lv = 1;
            kayer_ori.username = "Kayer";
            kayer_ori.userpwd = "123";
            //------------------------模拟一条重数据库得到的数据 end -----------------------------------------
            //拷贝一条kayer_ori数据 ( 可以用原型模式 , 这里我直接使用笨办法 )
            User kayer_change_copy = new User();
            kayer_change_copy.id = kayer_ori.id;
            kayer_change_copy.name = kayer_ori.name;
            kayer_change_copy.sex = kayer_ori.sex;
            kayer_change_copy.lv = kayer_ori.lv;
            kayer_change_copy.username = kayer_ori.username;
            kayer_change_copy.userpwd = kayer_ori.userpwd;
            // --- 改变数据 ---
            kayer_change_copy.name = "Aonaufly";
            kayer_change_copy.lv = 4;
            string sql_update = SQL_Structure.UPDATE_T_SQL<User>(kayer_ori, kayer_change_copy);
            SqlParameter[] update_p = SqlParameter_Structure.UPDATE_T_SQL<User>(kayer_ori, kayer_change_copy);
            int i = SqlHelper.ExecteNonQuery(CommandType.Text, sql_update, update_p);
            if (i > 0)
            {
                Console.WriteLine("执行操作成功");
            }
            else
            {
                Console.WriteLine("执行操作失败");
            }

结果 :

在数据库中:

未完待续 ..........................

时间: 2025-01-02 19:19:20

C# SQL封装(四)的相关文章

C# SQL封装(二)

接 C# SQL封装(一) 开始操作数据库的测试 : using System;using System.Collections.Generic;using System.Linq;using System.Text;using DBDome.com;using DBDome.model;using System.Data.SqlClient;using System.Data; namespace DBDome{    class Program    {        static void

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传)

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传) 背景 断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全! 效果 实现 下载和之前的http请求可以相互独立,所以我们单独给download建立一个工程moudel处理 1.创建service接口 和以前一样,先写接口 注意:Streaming是判断是否写入内存的标示,如果小文件可以

[转]深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

深入理解SQL的四种连接-左外连接.右外连接.内连接.全连接 1.内连接(典型的连接运算,使用像 =  或 <> 之类的比较运算符).包括相等连接和自然连接.     内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外连接.外连接可以是左向外连接.右向外连接或完整外部连接.     在 FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT

SQL的四种语言和数据库范式

1. SQL的四种语言 DDL(Data Definition Language)数据库定义语言 CREATE ALTER DROP TRUNCATE COMMENT RENAME DML(Data Manipulation Language)数据操纵语言 SELECT INSERT UPDATE DELETE MERGE CALL EXPLAIN PLAN LOCK TABLE DCL(Data Control Language)数据库控制语言 GRANT REVOKE TCL(Transac

SQL的四种连接

SQL的四种连接-内连接.左外连接.右外连接.全连接   今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以达到效果. 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定联接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选联接条件所选的行.     联接可分为以下几类: 1.内联接(典型的联接运算,使用像 =  或

Oracle SQL(四)

5. SQL高级--表优化相关(序列.视图等) 5.1 INDEX(索引) 可以在表中创建索引,以便更加快速高效地查询数据. 用户无法看到索引,它们只能被用来加速搜索/查询. PS:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新.因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引. 5.2 索引新增 --在表上创建一个简单的索引.允许使用重复的值 CREATE INDEX 索引名 ON 表 (列) --在表上创建一个唯一的索引.不允许使用重复的

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转载)

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.     2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEFT

C# SQL封装(一)

感谢软谋徐老师的SQLHelper.as , 代码如下(本人有所改动): using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace DBDome {     ///

CI中写原生SQL(封装查询)

封装查询 封装,通过让系统为你组装各个查询语句,能够简化你的查询语法.参加下面的范例: $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); 查询语句中的问号会自动被查询函数中位于第二个参数位置的数组中的值所替代. 使用封装查询的第二个好处是所有的值都会被自动转义,形成了较为