当前位置:Gxlcms > 数据库问题 > Oracle+Ado.Net(一)

Oracle+Ado.Net(一)

时间:2021-07-01 10:21:17 帮助过:6人阅读

以前曾经用过Oracle+ExtJS进行项目开发,可能接触的很少,感觉和Sqlserver数据库大同小异,

就我自己而言,很多项目一般基于Ado.Net+Sqlserver2008 R2这一套(用过的Entity FrameWork实体框架(ORM)底层也是基于Ado.Net去访问数据库).

现在我自己写一个用Ado.Net访问Oracle数据库的一点点代码(还不完整,以后会补全基本的常用操作功能),我自己的思路是从简单三层一点点往抽象模式进行编写

 

首先定义的UserInfo是从oracle数据库映射的一个实体对象,在数据访问层中以UserInfoDal形式继承至BaseDal<T>泛型父类和一个关于对于List操作的泛型接口,

代码如下:

技术分享

GetListByWhere()和GetListByWhere(string where)实现基本一致,DataReaderToList(OracleDataReader dr)和DataSetToList(DataSet ds)思路一样(ListAction<T>的东西),其中实现代码如下:

  public List<UserInfo> GetListByWhere()
        {
            OracleConnection conn = DbAction.getConn();
            string sqlStr = "select * from userinfo t";
            OracleCommand com = new OracleCommand(sqlStr, conn);
            conn.Open();
            OracleDataReader dr = com.ExecuteReader();
            List<UserInfo> list = DataReaderToList(dr);
            conn.Close();
            return list;
        }

   public List<UserInfo> DataReaderToList(OracleDataReader dr)
        {
            try
            {
                List<UserInfo> list = null;
                while (dr.Read())
                {
                    list = new List<UserInfo>();
                    UserInfo t = new UserInfo();
                    t.Fid = int.Parse(dr.GetOracleNumber(0).ToString());
                    t.Fname = dr.GetOracleString(1).ToString();
                    t.Fpassword = dr.GetOracleString(2).ToString();
                    list.Add(t);
                }
                return list;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dr.Close();
            }
        }

其中会涉及到一个DbAction类,可以封装一些数据库连接关闭等的对象以及方法:

 public static class DbAction
    {
        private readonly static string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ToString();


        public static OracleConnection getConn()
        {
            OracleConnection conn = new OracleConnection(connString);
            return conn;
        }

      //.....可以继续补充

    }

回归正题,正常的通用逻辑应该归于在BaseDal<T>泛型父类中进行实现

技术分享

其中TableName,PrimaryKey字段属性和泛型T的实体对象,将在进行通用sql语句编程时起到作用.

BaseDal<T>实现BaseAction<T>接口的方法,并约束T在BaseModel,且允许进行new操作

实现的Delete方法代码如下:

   public bool Delete(string id)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("delete from {0} where {1}=:id",TableName,PrimaryKey);


            OracleConnection conn = DbAction.getConn();
            OracleCommand com = new OracleCommand(sb.ToString(), conn);
            com.Parameters.Add(DbHelper.CreateParam("id", string.IsNullOrEmpty(id) ? "0" : id));
            conn.Open();
            int i=com.ExecuteNonQuery();
            conn.Close();
            if(i>0)
            {
                return true;
            }
            return false;
        }

需要注意的是,在BaseModel也需要要有TableName,PrimaryKey等(以后会添加其他字段属性),并且在Model中自己定义的映射实体对象必须指定PrimaryKey

技术分享

人气教程排行