Dapper连接Oracle

Dapper连接Oracle
去年写过了篇博客,名字叫:让dapper支持Oracle

网址:http://www.cnblogs.com/ushou/archive/2012/09/28/2706905.html
有很多网友查看并评论,也引来很多网站转载,在这里深表歉意,因为去年搞的思路是错的,我有罪呀。
其实Dapper原生是支持Oracle的,只是去年水平有限,或者说查阅的资料还不够多,所以“毁”人不倦。
今年7月份的时候搞出这个新的Demo,只是一直忙与工作,没来得及分享出来,现将主要代码写出来吧,希望对大家有帮助。

首先创建数据库连接,代码如下:

    public class DapperFactory
    {
        public static readonly string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Wip_TestConnStr"].ToString();


        public static OracleConnection CrateOracleConnection()
        {
            var connection = new OracleConnection(connectionString);
            connection.Open();
            return connection;
        }

    }

 

其次,基于Oracle,实现简单的增、删、改、查、事务、分页等。

using System;
using System.Collections.Generic;
using System.Linq;
using Dapper;
using Tcl.ForLog.Model;
using System.Data.OracleClient;
using System.Data;

namespace Strong.Plm.SqlRepository
{
    public class WUFEI_TESTTBRepository
    {
        public bool AddWUFEI_TESTTB(WUFEI_TESTTBModel wufei_testtb)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                string executeSql = @" INSERT INTO WUFEI_TESTTB (USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK ) 
                           VALUES (:USER_ID, :USER_NAME, :USER_ADDRESS, :USER_SEX, :USER_BIRTHDAY, :USER_REMARK) ";
                return conn.Execute(executeSql, wufei_testtb) > 0 ? true : false;
            }
        }

        /// <summary>
        /// 使用事务批量新增
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public int AddWUFEI_TestTbByTrans(List<WUFEI_TESTTBModel> list)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {                
                IDbTransaction transaction = conn.BeginTransaction();
                int row = 0;
                foreach (var item in list)
                {
                    string executeSql = @" INSERT INTO WUFEI_TESTTB (USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK ) 
                           VALUES (:USER_ID, :USER_NAME, :USER_ADDRESS, :USER_SEX, :USER_BIRTHDAY, :USER_REMARK) ";
                    row += conn.Execute(executeSql, item, transaction, null, null);
                }
                transaction.Commit();
                return row;                
            }
        }

        public bool DeleteWUFEI_TESTTB(int USER_ID)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                string executeSql = @" DELETE FROM WUFEI_TESTTB WHERE USER_ID = :USER_ID  ";
                var conditon = new { USER_ID = USER_ID };
                return conn.Execute(executeSql, conditon) > 0 ? true : false;
            }
        }

        public bool EditWUFEI_TESTTB(WUFEI_TESTTBModel wufei_testtb)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                string executeSql = @" UPDATE WUFEI_TESTTB SET USER_NAME = :USER_NAME,USER_ADDRESS = :USER_ADDRESS,USER_SEX = :USER_SEX,USER_BIRTHDAY = :USER_BIRTHDAY,USER_REMARK = :USER_REMARK   
                                    WHERE USER_ID = :USER_ID  ";
                return conn.Execute(executeSql, wufei_testtb) > 0 ? true : false;
            }
        }

        public bool UpdateWUFEI_TESTTB(string sqlStr)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                return conn.Execute(sqlStr) > 0 ? true : false;
            }
        }

        public WUFEI_TESTTBModel GetWUFEI_TESTTB(Decimal USER_ID)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                String executeSql = @" SELECT USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK FROM WUFEI_TESTTB
                                    WHERE USER_ID = :USER_ID ";
                var conditon = new { USER_ID = USER_ID };
                return conn.Query<WUFEI_TESTTBModel>(executeSql, conditon).SingleOrDefault();
            }
        }
        public KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>> WUFEI_TESTTBPaginationA(Pagination pagin, WUFEI_TESTTBModel condition)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                String condtionStr = "";
                String executeQuery = String.Format(@"SELECT * FROM (SELECT table_source.*, ROWNUM AS rowno
                                          FROM ( SELECT  USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK
                                          FROM WUFEI_TESTTB
                                          WHERE 1= 1 {2}) table_source
                                          WHERE ROWNUM <= ({0}  * {1})) table_alias
                                          WHERE table_alias.rowno >= ((({0} - 1)  * {1}) + 1)", pagin.CurrentPageIndex, pagin.PageSize,condtionStr);

                String executeCount = String.Format("SELECT COUNT(1) AS CountNum FROM WUFEI_TESTTB WHERE 1= 1 {0}", condtionStr);
                var mixCondition = new
                {
                    CurrentPageIndex = pagin.CurrentPageIndex,
                    PageSize = pagin.PageSize
                };
                List<WUFEI_TESTTBModel> listScore = conn.Query<WUFEI_TESTTBModel>(executeQuery, null).ToList();                               

                pagin.TotalItemCount = conn.Query<Decimal>(executeCount, null).SingleOrDefault();
                KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>> result =
                    new KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>>(pagin, listScore);
                return result;
            }
        }

        public KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>> WUFEI_TESTTBPagination(Pagination pagin, WUFEI_TESTTBModel condition)
        {
            using (OracleConnection conn = DapperFactory.CrateOracleConnection())
            {
                String condtionStr = "";
                String orderBy = "USER_ID DESC";
                if (!String.IsNullOrEmpty(pagin.OrderBy))
                {
                    orderBy = pagin.OrderBy;
                }

                String executeQuery = String.Format(@"SELECT * FROM (SELECT table_source.*, ROWNUM AS rowno From(
                                        SELECT USER_ID, USER_NAME, USER_ADDRESS, USER_SEX, USER_BIRTHDAY, USER_REMARK FROM WUFEI_TESTTB
                                        WHERE 1= 1 {0} ) table_source
                                        WHERE ROWNUM <= (:CurrentPageIndex * :PageSize)) table_alias 
                                        WHERE table_alias.rowno >= (((:CurrentPageIndex - 1)  * :PageSize) + 1)", condtionStr, orderBy);
      

                String executeCount = String.Format("SELECT COUNT(*) AS CountNum FROM WUFEI_TESTTB WHERE 1= 1 {0} ", condtionStr);
                var mixCondition = new
                {
                    CurrentPageIndex = pagin.CurrentPageIndex,
                    PageSize = pagin.PageSize
                };
                List<WUFEI_TESTTBModel> listScore = conn.Query<WUFEI_TESTTBModel>(executeQuery, mixCondition).ToList();
                pagin.TotalItemCount = conn.Query<Decimal>(executeCount, mixCondition).SingleOrDefault();
                KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>> result =
                    new KeyValuePair<Pagination, IList<WUFEI_TESTTBModel>>(pagin, listScore);
                return result;
            }
        }
    }
}

 

这里以表WUFEI_TESTTB为例,字段很少,就不提供Sql语句了,用户自己创建下吧。

其中WUFEI_TESTTBModel就是表WUFEI_TESTTB的实体类。

代码如下:

using System;
using System.Data;
using System.Collections;
using System.Xml;
using System.Runtime.Serialization;
namespace Tcl.ForLog.Model
{
    /// <summary>
    /// 表WUFEI_TESTTB的对象类    
    /// </summary> 
    [DataContract(Name = "WUFEI_TESTTB")]
    public class WUFEI_TESTTBModel
    {
        #region 表名称常量

        /// <summary>
        /// 表名称
        /// </summary>
        public const string TABLE_NAME = "WUFEI_TESTTB";

        #endregion

        #region 属性

        /// <summary>
        /// 用户ID
        /// </summary>
        [DataMember(Name = "USER_ID")]
        public decimal USER_ID { get; set; }

        /// <summary>
        /// 用户名称
        /// </summary>
        [DataMember(Name = "USER_NAME")]
        public string USER_NAME { get; set; }

        /// <summary>
        /// 用户地址
        /// </summary>
        [DataMember(Name = "USER_ADDRESS")]
        public string USER_ADDRESS { get; set; }

        /// <summary>
        /// 用户性别
        /// </summary>
        [DataMember(Name = "USER_SEX")]
        public string USER_SEX { get; set; }

        /// <summary>
        /// 用户生日
        /// </summary>
        [DataMember(Name = "USER_BIRTHDAY")]
        public DateTime USER_BIRTHDAY { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        [DataMember(Name = "USER_REMARK")]
        public string USER_REMARK { get; set; }

        /// <summary>
        /// WUFEI_TESTTBModel深拷贝
        /// </summary>
        /// <returns></returns>
        public static WUFEI_TESTTBModel DeepCopy(WUFEI_TESTTBModel testTbA)
        {
            WUFEI_TESTTBModel testTbB = new WUFEI_TESTTBModel();
            testTbB.USER_ID = testTbA.USER_ID;
            testTbB.USER_NAME = testTbA.USER_NAME;
            testTbB.USER_ADDRESS = testTbA.USER_ADDRESS;
            testTbB.USER_SEX = testTbA.USER_SEX;
            testTbB.USER_BIRTHDAY = testTbA.USER_BIRTHDAY;
            testTbB.USER_REMARK = testTbA.USER_REMARK;

            return testTbB;
        }
        #endregion

    }
}

这里的代码看似很多,其实是通过CodeSmith生成的,非常便于快速开发网站。

 

如果对你有用,请帮忙点推荐,谢谢。

 

 

posted @ 2013-10-09 19:38  黑 瞳  阅读(17898)  评论(15编辑  收藏  举报