亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ado.net快速上手實踐篇(二)

2019-11-17 03:48:07
字體:
來源:轉載
供稿:網友

我們接著上文繼續完成我們的ado.net簡單實踐。

五、dal層數據訪問實現
在這里我們使用前一篇文章里實現的數據持久化層和偽SqlMapper對象,實現數據操作。下面我們來看看Dal下核心的Dao如何實現:
還記得我們在IBatis.net下面的dao類是怎么實現的嗎?沒錯,我們根據一個基類BaseDAO和它的構造函數,實現dao的配置加載。但是樓豬的實現沒有那么復雜和強大,本文的實現其實就是通過BaseDAO和構造函數獲取數據庫連接對象的key,初始化一個SqlMapper,然后利用SqlMapper對象進行基本的CRUD等等數據操作。那么我們如何利用BaseDAO和構造函數就像以前在IBatis.net系列文章里的提到的Dal層下那樣進行SqlMapper的初始化呢?
1、在AdoNetDataaccess.Mapper下我們定義公共的BaseDAO類

代碼

namespace AdoNetDataAccess.Mapper
{
    public abstract class BaseDAO
    {
        #region PRoperties

        public SqlMapper SqlMapper { get; set; }

        #endregion

        #region Constructor

        private BaseDAO()
        {
        }

        /// <summary>
        /// SqlMapper屬性適用
        /// </summary>
        /// <param name="mapperName"></param>
        public BaseDAO(string mapperName)
        {
            this.SqlMapper = MapperUtill.GetMapper(mapperName);
        }

        #endregion
    }
}

2、初始化SqlMapper的實用類

代碼
using System;
using System.Collections.Generic;
using System.Configuration;

namespace AdoNetDataAccess.Mapper
{
    using AdoNetDataAccess.Core.Contract;
    using AdoNetDataAccess.Core.Implement;

    public sealed class MapperUtill
    {
        #region fields

        public static string currentSqlKey = "sqlConn";

        public static int cmdTimeOut = 15;

        private static readonly object objSync = new object();

        private static readonly IDictionary<string, SqlMapper> dictMappers = new Dictionary<string, SqlMapper>();

        #endregion

        #region constructor and methods

        private MapperUtill()
        {

        }

        static MapperUtill()
        {
            try
            {
                cmdTimeOut = int.Parse(ConfigurationManager.AppSettings["db_timeOut"]);
            }
            catch
            {
                cmdTimeOut = 15;
            }
            //實例化SqlDbMapper
            for (int i = 0; i < ConfigurationManager.ConnectionStrings.Count; i++)
            {
                string key = ConfigurationManager.ConnectionStrings[i].Name;
                string value = ConfigurationManager.ConnectionStrings[i].ConnectionString;
                CreateMapper(key, value, cmdTimeOut);
            }
        }

        public static SqlMapper GetSqlMapper(string key)
        {
            return MapperUtill.GetMapper(key);
        }

        public static SqlMapper GetCurrentSqlMapper()
        {
            return MapperUtill.GetMapper(currentSqlKey);
        }

        public static void CreateMapper(string connKey, string sqlConStr, int connTimeOut)
        {
            IDbOperation operation = new SqlServer(sqlConStr, connTimeOut);
            SqlMapper mapper = new SqlMapper(operation);
            dictMappers.Add(connKey.ToUpper().Trim(), mapper);//不區分大小寫
        }

        public static SqlMapper GetMapper(string sqlConKey)
        {
            if (string.IsNullOrEmpty(sqlConKey))
            {
                throw new Exception("數據庫連接字符串主鍵為空!");
            }
            sqlConKey = sqlConKey.ToUpper();//不區分大小寫
            SqlMapper mapper = null;
            if (dictMappers.ContainsKey(sqlConKey))
            {
                mapper = dictMappers[sqlConKey];
            }
            else
            {
                throw new Exception(string.Format("沒有{0}所對應的數據庫連接", sqlConKey));
            }
            return mapper;
        }

        /// <summary>
        /// 釋放所有
        /// </summary>
        public void Release()
        {
            foreach (KeyValuePair<string, SqlMapper> kv in dictMappers)
            {
                SqlMapper mapper = kv.Value;
                if (mapper == null)
                {
                    continue;
                }
                mapper.CurrentDbOperation.CloseConnection();
            }
            dictMappers.Clear();
        }

        #endregion

    }
}

這個實用類的重要作用就是初始化配置文件里connectionStrings配置節點,以獲取sql連接對象必須的連接字符串。
3、PersonDao類
下面就是針對具體的Person表的數據操作了:

代碼
using System.Collections.Generic;
using System.Data;

namespace AdoNetDataAccess.Dal.Dao
{
    using AdoNetDataAccess.Dal.Model;
    using AdoNetDataAccess.Dal.Utility;
    using AdoNetDataAccess.Mapper;

    public class PersonDao : BaseDAO
    {
        public PersonDao()
            : base("sqlConn")//sqlConn是<connectionStrings>配置節點的一個name
        {
        }

        public int Insert(string sqlInsert)
        {
            int id = this.SqlMapper.Insert(sqlInsert);
            //object obj = this.SqlMapper.ExecuteScalar(sqlInsert, System.Data.CommandType.Text, null);
            return id;
        }

        public bool BatchInsert(IList<Person> listModels)
        {
            int batchSize = 50000;
            int copyTimeOut = 60;
            DataTable dt = DataTableHelper.CreateTable<Person>(listModels);
            bool flag = this.SqlMapper.BatchInsert(typeof(Person).Name, batchSize, copyTimeOut, dt);
            return flag;
        }

        public int Update(string sqlUpdate)
        {
            int result = this.SqlMapper.Update(sqlUpdate);
            return result;
        }

        public IList<Person> SelectPersons(string sqlSelect)
        {
            IList<Person> listPersons = this.SqlMapper.QueryForList<Person>(sqlSelect);
            return listPersons;
        }

        public IDictionary<int, Person> SelectDictPersons(string sqlSelect)
        {
            IDictionary<int, Person> dictPersons = this.SqlMapper.QueryForDictionary<int, Person>("Id", sqlSelect);
            return dictPersons;
        }

        public DataTable SelectPersonTable(string sqlSelect)
        {
            DataTable dt = this.SqlMapper.FillDataTable(sqlSelect, CommandType.Text, null);
            return dt;
        }

        public DataSet SelectPersonDataSet(string sqlSelect)
        {
            DataSet ds = this.SqlMapper.FillDataSet(sqlSelect, CommandType.Text, null);
            return ds;
        }

        public int Delete(string sqlDelete)
        {
            int result = this.SqlMapper.Delete(sqlDelete);
            return result;
        }

    }
}

到這里,一個dao類操作就實現了。然后我們按步就班實現對外調用的服務接口。在表現層調用吧。
六、表現層的調用
1、配置文件

代碼
  <appSettings>
    <add key="db_timeOut" value="5000"/>
  </appSettings>
  <connectionStrings>
    <add name="sqlConn" connectionString="Data Source=./sqlexpress; Initial Catalog=TestDb; User Id=sa; PassWord=123456;"/>
    <add name="sqlConnStr1" connectionString="Data Source=./sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;"/>
    <add name="sqlConnStr2" connectionString="Data Source=./sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;"/>
  </connectionStrings>
其中,connectionString是必須的,如果沒有,我們無法加載調用可用的SqlMapper。
2、CRUD操作測試

代碼
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;

namespace OOXXWebApp
{
    using AdoNetDataAccess.Dal;
    using AdoNetDataAccess.Dal.Model;

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //增刪改查測試
                string sqlInsert = "INSERT Person (FirstName,LastName,Weight,Height) VALUES( 'jeff','wong',70,180) SELECT @@IDENTITY FROM Person(NOLOCK)";
                string sqlUpdate = "UPDATE Person SET Height=178 WHERE Id=1";
                string sqlSelect = "SELECT TOP 100 * FROM Person(NOLOCK)";
                string sqlDelete = "DELETE Person  WHERE Id>10 AND Id<100";

                IList<Person> listModels = new List<Person>();
                for (int i = 0; i < 500000; i++)
                {
                    Person model = new Person();
                    model.FirstName = "Jeff";
                    model.LastName = "Wong";
                    model.Weight = 70;
                    model.Height = 180;
                    listModels.Add(model);
                }

                Response.Write("Test Beginning......<br/>");

                int id = ServiceFactory.CreatePersonService().Add(sqlInsert);
                Response.Write(string.Format("<br/>Insert and return id:{0}", id));

                bool flag = ServiceFactory.CreatePersonService().BatchInsert(listModels);
                Response.Write(string.Format("<br/> Batch Insert {0}", flag ? "succeed" : "failed"));

                IList<Person> listPersons = ServiceFactory.CreatePersonService().GetPersons(sqlSelect);
                Response.Write(string.Format("<br/>Select pesons and return persons:{0}", listPersons.Count));

                IDictionary<int, Person> dictPersons = ServiceFactory.CreatePersonService().GetDictPersons(sqlSelect);
                Response.Write(string.Format("<br/>Select pesons and return dictionary persons:{0}", dictPersons.Count));

                DataTable dt = ServiceFactory.CreatePersonService().GetPersonTable(sqlSelect);
                Response.Write(string.Format("<br/>Select pesons and return persons:{0}", dt.Rows.Count));

                DataSet ds = ServiceFactory.CreatePersonService().GetPersonDataSet(sqlSelect);
                Response.Write(string.Format("<br/>Select pesons and return persons:{0}", ds.Tables[0].Rows.Count));

                int affectNum = ServiceFactory.CreatePersonService().Modify(sqlUpdate);
                Response.Write(string.Format("<br/>Update and affect rows :{0}", affectNum));

                affectNum = 0;
                affectNum = ServiceFactory.CreatePersonService().Remove(sqlDelete);
                Response.Write(string.Format("<br/>Delete and affect rows :{0}", affectNum));

                Response.Write("<br/><br/>Test End.");
            }
        }
    }
}

這個就不用多說了吧,表現層寫SQL語句調用寫好的服務就行了。比較不舒服的地方就是SQL語句不得不寫在類里面,如果自動生成或者獨立放在xml下實現可配置的形式那就更好了,當然sql語句不是我們討論的重點,您有好的方法可以自己擴展實現更人性化的功能,減少書寫SQLl語句的工作。

七、最后,對demo工程文件結構進行簡單說明。
1、數據持久化層AdoNetDataAccess.Core
2、SqlMapper層AdoNetDataAccess.Mapper(引用AdoNetDataAccess.Core)
3、具體數據操作使用層AdoNetDataAccess.Dal(引用AdoNetDataAccess.Mapper)
4、表現層AdoNetDataAccessWebApp(引用AdoNetDataAccess.Dal)
可以看出,工程里的文件結構還是很清晰的,需要學習的童鞋不妨下載使用試試看吧。

demo下載:demo

作者:Jeff Wong
出處:http://www.49028c.com/jeffwongishandsome/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久色在线播放| 亚洲最新在线视频| 一本色道久久综合亚洲精品小说| 国产免费一区二区三区在线观看| 久久久精品一区二区| 日韩中文字幕第一页| 亚洲欧美日韩国产成人| 色一情一乱一区二区| 国产成人精品久久| 亚洲精品国产综合久久| 日韩视频在线一区| 久久亚洲私人国产精品va| 成人国产精品色哟哟| 亚洲黄色av女优在线观看| 欧美亚洲另类在线| 亚洲最大福利网| 91高清视频免费观看| 精品无人区乱码1区2区3区在线| 91po在线观看91精品国产性色| 日本午夜在线亚洲.国产| 在线观看国产精品91| 日韩av有码在线| 精品久久久久国产| 成人在线激情视频| 国产日韩欧美在线观看| 亚洲成人精品久久| 国产成人精品在线| 在线日韩第一页| 欧美激情视频免费观看| 国产欧美日韩精品专区| 精品视频在线播放免| 亚洲国产欧美久久| 亚洲视频在线观看网站| 国产免费亚洲高清| 久久精品美女视频网站| 国产aⅴ夜夜欢一区二区三区| 国产精品美女午夜av| 亚洲视频国产视频| 91午夜理伦私人影院| 亚洲字幕一区二区| 日韩精品极品视频免费观看| 亚洲综合一区二区不卡| 亚洲精品久久久久中文字幕二区| 亚洲一区二区在线播放| 日韩av影视在线| 一本色道久久综合亚洲精品小说| 亲爱的老师9免费观看全集电视剧| 日韩精品中文字幕在线观看| 隔壁老王国产在线精品| 国产欧美亚洲视频| 一区二区三区无码高清视频| 2020欧美日韩在线视频| 亚洲自拍欧美另类| 亚洲最大的av网站| 欧美日韩成人黄色| 欧美电影免费观看大全| 日韩av网站大全| 成人黄色短视频在线观看| 久久久在线视频| 日韩经典中文字幕在线观看| 亚洲天堂一区二区三区| 在线亚洲欧美视频| 久久亚洲私人国产精品va| 久久免费在线观看| 成人免费午夜电影| 成人精品视频久久久久| 久久亚洲电影天堂| 欲色天天网综合久久| 北条麻妃一区二区在线观看| 亚洲伊人成综合成人网| 国产精品99免视看9| 国产在线视频91| 国产精品扒开腿做爽爽爽视频| 岛国av一区二区三区| 中文在线资源观看视频网站免费不卡| 亚洲福利精品在线| 伦伦影院午夜日韩欧美限制| 欧美一级在线亚洲天堂| 欧美专区中文字幕| 亚洲欧美综合区自拍另类| 欧美激情视频在线| 国产精品久久久久不卡| 操91在线视频| 97色伦亚洲国产| 日韩动漫免费观看电视剧高清| 91中文在线观看| 精品国产一区二区三区久久狼5月| 国产日韩欧美综合| 久久久国产视频| 久久99精品久久久久久青青91| 久久精品国产欧美激情| 欧美日韩国产中文字幕| 日韩av第一页| 伊人久久男人天堂| 亚洲色图色老头| 国产欧美韩国高清| 国产成人+综合亚洲+天堂| 久热精品视频在线观看| 日韩美女视频免费在线观看| 国产精品视频在线观看| 亚洲国产精品va在线观看黑人| 国产精品欧美激情在线播放| 国产激情综合五月久久| 日韩av色综合| 成人免费淫片视频软件| 亚洲影院在线看| 欧美性精品220| 中文字幕精品影院| 国产香蕉97碰碰久久人人| 欧美肥臀大乳一区二区免费视频| www.欧美三级电影.com| 欧美日韩国产二区| 欧美激情奇米色| 日韩激情av在线免费观看| 亚洲成人av在线播放| 日韩中文字幕在线免费观看| 国内精品免费午夜毛片| 亚洲自拍偷拍网址| 国产婷婷色综合av蜜臀av| 亚洲色图校园春色| 国产亚洲欧美日韩一区二区| 国产成人av在线| 日韩av电影国产| 丝袜情趣国产精品| 国产噜噜噜噜久久久久久久久| 日韩欧美亚洲范冰冰与中字| 亚洲天堂影视av| 久久天天躁狠狠躁夜夜av| 国产精品一久久香蕉国产线看观看| 日韩av在线网址| 亚洲aⅴ日韩av电影在线观看| 奇米一区二区三区四区久久| 国产精品亚洲аv天堂网| 国产精品精品视频一区二区三区| 91精品在线播放| 欧美电影《睫毛膏》| 亚洲一区二区三区视频播放| 亚洲在线免费观看| 久久久女女女女999久久| 欧美重口另类videos人妖| 亚洲成年人在线播放| 亚洲黄色www网站| 一个人看的www欧美| 日韩av免费在线播放| 亚洲跨种族黑人xxx| 视频在线观看一区二区| 国产精品视频免费在线观看| 精品久久久久久亚洲国产300| 亚洲毛片在线观看| 欧美小视频在线观看| 一区二区亚洲精品国产| 97精品国产97久久久久久春色| 国产午夜精品理论片a级探花| 国产欧美精品一区二区三区-老狼| 欧美丝袜第一区| 欧美亚洲第一页| 国产z一区二区三区| 午夜精品国产精品大乳美女| 久久国产精品久久久久| 日韩动漫免费观看电视剧高清| 亚洲韩国欧洲国产日产av| 欧美有码在线观看视频| 日韩欧美综合在线视频| 久久婷婷国产麻豆91天堂|