zoukankan      html  css  js  c++  java
  • Oracle+Ado.Net(二)

                                                       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

  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/4772018.html
Copyright © 2011-2022 走看看