博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle+Ado.Net(二)
阅读量:5090 次
发布时间:2019-06-13

本文共 3498 字,大约阅读时间需要 11 分钟。

                                                   Oracle+Ado.Net(二)

概要:更多详细的BaseDal请看Oracle+Ado.Net(一),这里只是对(一)的封装的东西进行简要介绍.

功能添加:

在BaseDal中添加了公共的新增,更新功能;

在Model层中添加以下代码:

        /// <summary>

        /// 标识自增长
        /// </summary>
        private bool isAutoId = true;
        public bool IsAutoId
        {
            get { return isAutoId; }
            set { isAutoId = value; }
        }
        private string columns = "*";
        public string Columns
        {
            get { return columns; }
            set { columns = value; }
        }
        private string where;
        public string Where
        {
            get { return where; }
            set { where = value; }
        }

在namespace myOracle.Dal下添加一个参数化查询类:

    using System.Data;

    using System.Data.OracleClient;
    /// <summary>
    /// 参数化查询类
    /// </summary>
    public class DbParam
    {
        /// <summary>
        /// 参数键
        /// </summary>
        private string _ParamName = "";
        /// <summary>
        /// 参数类型
        /// </summary>
        private OracleType _ParamDbType;
        /// <summary>
        /// 参数值
        /// </summary>
        private object _ParamValue = null;
        public string ParamName
        {
            get { return _ParamName; }
            set { _ParamName = value; }
        }
        public  OracleType ParamDbType
        {
            get { return _ParamDbType; }
            set { _ParamDbType = value; }
        }
        public object ParamValue
        {
            get { return _ParamValue; }
            set { _ParamValue = value; }
        }
    }

在BaseDal层的具体代码(使用反射技术):

            StringBuilder sb = new StringBuilder();

            StringBuilder ParamStr = new StringBuilder();
            sb.AppendFormat("insert into {0} (",TableName);
            List<DbParam> list = new List<DbParam>();
            PropertyInfo[] propertys = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public);
            for (int i = 0; i < propertys.Length; i++)
            {
                if(t.IsAutoId)
                {
                    if (propertys[i].Name == PrimaryKey)
                        continue;
                }
                //DateTime类型处理(日期最小不能小于1900.1.1)
                if (propertys[i].PropertyType == typeof(DateTime) && ((DateTime)propertys[i].GetValue(model, null)) < new DateTime(1900, 1, 1))
                {
                    propertys[i].SetValue(model, new DateTime(1900, 1, 1), null);
                }
                sb.Append(propertys[i].Name+",");
                ParamStr.Append(":"+propertys[i].Name+",");
                DbParam param = new DbParam() {
                 ParamName=":"+propertys[i].Name,
                  ParamDbType=TypeConvert.GetOracleDbType(propertys[i].PropertyType),
                   ParamValue=propertys[i].GetValue(model,null)
                };
                list.Add(param);
            }
            sb.Replace(",",")",sb.Length-1,1);
            ParamStr.Replace(",",")",ParamStr.Length-1,1);
            sb.Append(" values(");
            sb.Append(ParamStr);//在plsql虽然可以加上分号";",但是在这里不能加上分号";"
            if(t.IsAutoId)
            {
            /*
             * 先取得一个序列的下一个值:
               select myseq.nextval from dual;
               然后再把这个值当成主键值插入数据表:
               insert into mytable (id, ...) values (id_val, ...)
             * */
            }
            OracleConnection conn=DbAction.getConn();
            OracleCommand com = new OracleCommand(sb.ToString(), conn);
            foreach (DbParam item in list)
            {
                
                com.Parameters.Add(DbHelper.CreateParam(item.ParamName,item.ParamValue));
                //com.Parameters.Add(p);
            }
            OracleString rowid;
            conn.Open();
            com.ExecuteOracleNonQuery(out rowid);
            conn.Close();

至于在更新Update方法中,我们需要先封装一个方法:

         /// <summary>

        /// 是否字段值是否更新由BaseModel的columns定义===>推断出反射出来的属性是否需要更新
        /// </summary>
        /// <param name="model">columns定义的列</param>
        /// <param name="val">反射的属性</param>
        /// <returns>是否更新</returns>
        private bool IsUpdateProperty(T model,string val)
        {
            bool result = false;
            string strs=model.Columns;
            if(strs=="*")
            {
                return true;
            }
            string[] cols=strs.Split(',');
            for (int i = 0; i < cols.Length; i++)
            {
                if(val.Equals(cols[i],StringComparison.OrdinalIgnoreCase))
                {
                    result = true;
                    //跳出循环
                    break;
                }
            }
            return result;
        }

在update方法中:需要进行判断一下是否

                 if(this.IsUpdateProperty(model,ps[i].Name))

                 {
                     sb.Append(ps[i].Name+"="+":"+ps[i].Name+",");
                     list.Add( DbHelper.CreateParam(ps[i].Name, ps[i].GetValue(model, null)));
                 }

Update于Insert大致一样;

 

总结:在拼接sql语句的时候需要非常细心,中英文输入法,还有sql语句最后不要加";"

 

END

 

转载于:https://www.cnblogs.com/Francis-YZR/p/4772018.html

你可能感兴趣的文章
javaWeb中的文件上传下载
查看>>
开始学习MFC
查看>>
第三周作业(三)
查看>>
手把手教你如何使用webpack+react
查看>>
Java设计模式-----单例模式
查看>>
组合和继承
查看>>
Python-1写Python程序的头
查看>>
openstack pike 使用 linuxbridge + vxlan
查看>>
vim 括号匹配 以及各种跳转技巧
查看>>
正在学习或准备学习 Web 应用开发的初学者
查看>>
各大公司架构实践聚合
查看>>
linq中group by 的用法
查看>>
西安前端交流会 - 【前端求职、就业、面试技巧】- 第5期-2015.3.29 报名了
查看>>
Linux-进程间通信(四): 域套接字
查看>>
jq check 复选变单选。
查看>>
C#父类子类对象关系
查看>>
(转)RACI模型(RACI Model)
查看>>
关于&&和||
查看>>
HTML5 学习笔记(一)——HTML5概要与新增标签
查看>>
浅谈MySQL之@1
查看>>