精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何打造自己的數據訪問層二

數據庫
當我們已了解了.NET對數據庫操作的基本原理,只需要兩個基本對象,就可以形成簡單的數據訪問層了。

當我們通過上篇《打造自己的數據訪問層一》已了解了.NET對數據庫操作的基本原理,并就Ado.net對象的使用提出了幾點疑問:

1、如何由系統來判斷數據庫型。

2、如何消除這些重復代碼。

而上篇中也提出了一種解決思路,對ADO.NET對象進行封裝,具體應該如何實施?

1、需要一個對象,該對象用于建立內存表與物理表的之間映射關系,解決數據查詢、更新操作,形成了數據映射對象,定義為DataMapping。

2、每一個映射對象只與一張物理建立映射關系,如果有多個這樣的對象同時操作,如何解決?這時就需要另一個對象,用于添加映射對象集合,打包映射對象操作,形成了數據執行者,定義為DataExecutor。

想想看,只需要這兩個基本對象,就可以形成簡單的數據訪問層了。

先實現DataMapping,它應具備如下功能。

1、需要知道物理表的信息,表名、主鍵集、字段集。

2、需要知道映射的是什么類型的數據庫,MSSql數據庫、Oracle數據庫、MySql數據庫或者其他類型的數據庫。

3、可查詢數據,即填充內存表。

4、可更新數據,并且可設置更新操作方式。

5、可加入到事務中去。

根據上述功能,可初步設計出的DataMapping類:

public class DataMapping
{
public DataMapping()
{ }

/// <summary>
/// 填充數據集
/// </summary>
public void Fill()
{

}

/// <summary>
/// 設置更新命令
/// </summary>
public void SetCommands()
{

}

/// <summary>
/// 設置數據提交事務
/// </summary>
public void SetTransaction()
{

}

/// <summary>
/// 提交數據
/// </summary>
public bool Update()
{

}

/// <summary>
/// 更新列名
/// </summary>
public string Columns
{
get
{
return columns;
}
set
{
columns
= value;
}
}
private string columns = "";

/// <summary>
/// 主鍵名
/// </summary>
public string KeyColumns
{
get
{
return keyColumns;
}
set
{
keyColumns
= value;
}
}
private string keyColumns = "";

/// <summary>
/// 表名
/// </summary>
public string TableName
{
get
{
return tableName;
}
set
{
tableName
= value;
}
}
private string tableName = "";
}


再來實現DataExecutor類,它應具備的功能:

1、應該知道執行什么類型的數據庫操作。

2、可以添加映射對象。

3、可以進行數據提交。

如何來知道執行的數據庫類型,我們可以定義具體的執行者,比如MSSql執行者、Oracle執行者、MySql執行者。

可以初步設計出DataExecutor類
 

public abstract class DataExecutor
{
private IList<DataMapping> lisDataMappings = new List<DataMapping>();

/// <summary>
/// 添加數據映射對象
/// </summary>
public void AddDataMapping(DataMapping map)
{

}

/// <summary>
/// 更新數據
/// </summary>
public bool Update()
{

}
}

public class MSSqlExecutor : DataExecutor
{

}

public class OracleExecutor : DataExecutor
{

}

public class MySqlExecutor : DataExecutor
{

}


準備就緒,開始行具體設計。

先從DataMapping的Fill方法入手,看看它是如何查詢數據的。

public void Fill(string sqlText, string tableName, DataSet ds)
{
IDbConnection conn
= 具體的數據連接對象;
IDbDataAdapter dataAdapter
= 具體的數據適配對象;
IDbCommand cmd
= 具體的命令對象;
cmd.Connection
= conn;
cmd.CommandText
= sqlText;
dataAdapter.SelectCommand
= cmd;
((DbDataAdapter)dataAdapter).Fill(ds, tableName);
}

問題出來了,這里出現了具體的對象,如何得到這些對象?

前面我們設計了MSSqlExecutor類,它已經知道具體的數據庫類型,所以它也應該知道進行數據操作的具體的對象,DataMapping類是否可以引用該它,從而通過它來獲取數據操作對象,因此,可以MSSqlExecutor類及DataMapping類進行修改,使DataMapping對MSSqlExecutor類產生依賴關系;這只是對MSSql數據庫進行操作,現要改變數據庫對象為Oracle了,DataMapping類應該也需要對OracleExecutor類產生依賴關系。

因此,這里可以設計一個接口,用于獲取具體對象:

/// <summary>
/// 映射執行接口
/// </summary>
public interface IMappingExecute
{
/// <summary>
/// 獲取連接對象
/// </summary>
IDbConnection GetConn();

/// <summary>
/// 獲取數據適配器
/// </summary>
IDbDataAdapter GetDataAdapter();

/// <summary>
/// 獲取命令對象
/// </summary>
IDbCommand GetCommand();

/// <summary>
/// 獲取命令參數
/// </summary>
IDbDataParameter GetDataParameter(string col);

/// <summary>
/// 獲取命令參數
/// 數據庫之間的命令參類是不一樣的
/// MMSql是“@” + 列名,Oracle是 “:” + 列名,MySql是 “?” + 列名
/// </summary>
string GetSourceColumn(string col);
}

改造后的MSSqlExecutor類為:

public class MSSqlExecutor : DataExecutor, IMappingExecute
{
}

改造后的DataMapping類為:

public class DataMapping
{
private IDbConnection conn = null;
private IDbDataAdapter dataAdapter = null;

/// <summary>
/// 映射執行對象
/// </summary>
public IMappingExecute ExecuteObject
{
set
{
executeObj
= value;
conn
= executeObj.GetConn();
}
}
private IMappingExecute executeObj;

/// <summary>
/// 填充數據集
/// 參數:查詢語句
/// 參數:內存表名
/// </summary>
public void Fill(string sqlText, string tableName, DataSet ds)
{
dataAdapter
= executeObj.GetDataAdapter();
IDbCommand cmd
= executeObj.GetCommand();
cmd.Connection
= conn;
cmd.CommandText
= sqlText;
dataAdapter.SelectCommand
= cmd;
((DbDataAdapter)dataAdapter).Fill(ds, tableName);
}
}
到此為止,查詢功能算是完成了,接下來該實現更新功能了,從SetCommands入手,以新增操作為例:
 
/// <summary>
/// 設置更新命令
/// </summary>
public void SetCommands(DataCommandType commandType, DataSet ds)
{

if ((commandType & DataCommandType.Insert) == DataCommandType.Insert)
{
CreateInsertCommand(ds);
}

if ((commandType & DataCommandType.Update) == DataCommandType.Update)
{
CreateUpdateCommand(ds);
}

if ((commandType & DataCommandType.Delete) == DataCommandType.Delete)
{
CreateDeleteCommand(ds);
}
}


/// <summary>
/// 生成新增命令及SQL語句
/// </summary>
private void CreateInsertCommand(DataSet ds)
{
IList
<string> lisColumns = GetColumns(ds);
StringBuilder sbCol
= new StringBuilder();
StringBuilder sbVal
= new StringBuilder();
foreach (string col in lisColumns)
{
sbCol.AppendFormat(
", {0}", col);
sbVal.AppendFormat(
", {0}", executeObj.GetSourceColumn(col));
}

sbCol.Remove(
0, 2);
sbVal.Remove(
0, 2);
string sqlText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", tableName, sbCol.ToString(), sbVal.ToString());
IDbCommand cmd
= executeObj.GetCommand();
cmd.Connection
= conn;
cmd.CommandText
= sqlText;
SetCommandParams(cmd, lisColumns);
dataAdapter.InsertCommand
= cmd;
}

/// <summary>
/// 獲取列字段集
/// </summary>
private IList<string> GetColumns(DataSet ds)
{
IList
<string> lisColumns = new List<string>();
if (columns != "*")
{
string[] sltCol = columns.Split(',');
foreach (string col in sltCol)
{
lisColumns.Add(col.Trim());
}
}
else
{
DataTable dt
= ds.Tables[tableName];
foreach (DataColumn dc in dt.Columns)
{
lisColumns.Add(dc.ColumnName);
}
}

return lisColumns;
}

 
更新操作非常簡單,就是在上一篇的數據操作原理的基礎上動態生成了查詢語句及參數綁定,不多做解釋。 

其中DataCommandType為自定義枚舉類型:

/// <summary>
/// 數據操作命令類型
/// </summary>
public enum DataCommandType
{
/// <summary>
/// 新增
/// </summary>
Insert = 1,

/// <summary>
/// 修改
/// </summary>
Update = 2,

/// <summary>
/// 刪除
/// </summary>
Delete = 4
}

更新完后進行數據提交:

/// <summary>
/// 提交數據
/// </summary>
public bool Update(DataSet ds)
{
return ((DbDataAdapter)dataAdapter).Update(ds, tableName) > 0;
}

至此,數據更新操作也已經完成,***再看看數據執行者是如何進行批量提交。

這里產生的***個問題是,什么時候數據執行者會人將映射對象加入到集合中來,其中一種方法是在DataMapping設置更新的時候自己加入到集合去。

因此, 映射執行接口得多添加一個方法,用于新增映射對象:

/// <summary>
/// 添加數據映射對象
/// </summary>
void AddDataMapping(DataMapping map);
 
修改SetCommand方法:
/// <summary>
/// 設置更新命令
/// </summary>
public void SetCommands(DataCommandType commandType, DataSet ds)
{
//設置更新事件時添加映射對象
executeObj.AddDataMapping(this);
}
現在執行者中已經存在了,可以進行***的數據提交:
/// <summary>
/// 更新數據
/// </summary>
public bool Update(DataSet ds)
{
using (conn)
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}

IDbTransaction transaction
= conn.BeginTransaction(IsolationLevel.ReadCommitted);
foreach (DataMapping map in lisDataMappings)
{
map.SetTransaction(transaction);
}

try
{
foreach (DataMapping map in lisDataMappings)
{
map.Update(ds);
}

transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new System.Exception(ex.Message);
}
}

return true;
}

//DataMapping類設置事務
/// <summary>
/// 設置數據提交事務
/// </summary>
public void SetTransaction(IDbTransaction transaction)
{
if (dataAdapter.InsertCommand != null)
{
dataAdapter.InsertCommand.Transaction
= transaction;
}

if (dataAdapter.UpdateCommand != null)
{
dataAdapter.UpdateCommand.Transaction
= transaction;
}

if (dataAdapter.DeleteCommand != null)
{
dataAdapter.DeleteCommand.Transaction
= transaction;
}
}

 
到些為止,我們自己的數據訪問層功能已基本完成,但是,我們要如何對其進行調用,現在的方式真能方便的讓我們進行調用嗎?答案是否定的。
 

暫且至此為止,下一篇我們再進行***的收尾工作,并最終打造成符合自己需求的數據訪問層

 

原文鏈接:http://www.cnblogs.com/FlySoul/archive/2011/05/04/2036953.html

【編輯推薦】

  1. 曬曬我的通用數據訪問層
  2. 幾步走,教你創建簡單訪問數據庫方法
  3. 一句代碼實現批量數據綁定 下
  4. 一步一步設計你的數據庫1
  5. 不重復隨機數列生成算法
責任編輯:艾婧 來源: 博客園
相關推薦

2011-05-10 16:44:43

數據訪問層

2011-05-07 12:56:39

數據訪問

2010-03-17 16:19:28

Linux 常用應用軟

2011-03-29 09:15:28

通用數據訪問層

2009-01-08 09:52:26

2025-01-26 17:00:46

2009-08-13 14:59:00

C#數據訪問層

2012-01-11 09:46:31

DAL

2016-02-15 14:13:39

Python編碼環境

2023-07-27 08:16:51

數據訪問層項目

2013-11-26 09:47:47

ORM

2009-08-04 10:17:55

ASP.NET SqlASP.NET數據訪問

2009-08-19 10:54:42

ASP.NET數據訪問

2009-09-04 18:00:54

C#數據訪問層

2012-06-07 10:53:08

架構設計數據訪問層設計原則

2011-08-31 13:45:38

Demon CamipadiPhone

2020-12-14 08:09:03

弱口令工具掃描

2015-10-15 09:37:50

桌面環境發行版Linux

2011-04-27 11:04:37

2009-07-24 13:25:43

創建數據訪問層
點贊
收藏

51CTO技術棧公眾號

日韩影片中文字幕| 亚洲av片在线观看| 五月久久久综合一区二区小说| 欧美老女人在线| 欧美做受777cos| 日韩一区二区三区在线观看视频| 日韩中文字幕区一区有砖一区| 日韩亚洲欧美成人| www.17c.com喷水少妇| 浪潮色综合久久天堂 | 亚洲欧美卡通动漫| a级日韩大片| 欧美性大战久久久久久久蜜臀 | 欧美女孩性生活视频| 欧美黄色免费网址| 午夜视频在线观看网站| av在线不卡网| 91亚洲永久免费精品| 久久久久久久久久影院| 伊人成综合网| 亚洲一区av在线播放| 亚洲图片欧美另类| 日韩一级视频| 色狠狠桃花综合| 久久久久久av无码免费网站下载| 91在线直播| 91在线视频播放| 亚洲一区亚洲二区| 亚洲天堂视频网| 亚洲欧美日韩一区在线观看| 欧美精品久久久久久久久| 91香蕉国产视频| 久久最新网址| 日韩av在线最新| 国产原创剧情av| 亚洲资源在线| 欧美欧美欧美欧美首页| 热久久精品国产| free性欧美16hd| 亚洲综合激情小说| 在线观看日韩羞羞视频| chinese偷拍一区二区三区| 91年精品国产| 蜜桃视频成人| 视频国产在线观看| 97精品国产露脸对白| 99热在线国产| 亚洲国产中文字幕在线| 国产精品99久久久久| 国产日韩在线精品av| 中文字幕日韩国产| 麻豆极品一区二区三区| 国产精品一区二区久久| 中文字幕第315页| 日本免费新一区视频| 国产成人精品久久久| 久久久久99精品成人片三人毛片| 一本久久综合| 97婷婷大伊香蕉精品视频| 精品一区在线视频| aa国产精品| 91精品国产成人| 成人毛片18女人毛片| 午夜一区在线| 国产成人午夜视频网址| 中文字幕在线2019| 国产自产视频一区二区三区| 91免费在线视频网站| 国产成人精品一区二三区四区五区| 韩国成人福利片在线播放| 成人久久一区二区| 亚洲乱色熟女一区二区三区| 丁香婷婷综合激情五月色| 国内精品国语自产拍在线观看| 亚州av在线播放| 国产欧美一区二区三区在线老狼 | av一区在线观看| 国产精品国产成人国产三级| 亚洲自拍偷拍二区| 伊人手机在线| 欧美日韩国产一区在线| 成年人免费大片| 日韩五码电影| 亚洲成人三级在线| 少妇一级黄色片| 午夜激情一区| 日韩免费av片在线观看| 国产剧情精品在线| 成人av午夜电影| 婷婷久久青草热一区二区| 国产剧情在线| 欧美日韩一区二区在线| 亚洲精品综合在线观看| 噜噜噜天天躁狠狠躁夜夜精品 | 在线看福利影| 欧美午夜片欧美片在线观看| 91女神在线观看| 国产成人aa在线观看网站站| 国产一区二区免费| 国产精品白嫩白嫩大学美女| 久久免费国产| 91中文字精品一区二区| 国产精品视频二区三区| 亚洲一区二区三区四区在线| 国产福利一区视频| 99re6热只有精品免费观看| 亚洲视频999| 久草视频在线资源| 免费高清成人在线| 久久亚洲一区二区| 18加网站在线| 欧美亚洲国产bt| 91精品小视频| 欧美日韩爆操| 国产免费一区二区三区在线能观看| 你懂的网站在线| 中文字幕一区二区三区视频| www.爱色av.com| 日韩中文字幕无砖| 在线观看免费高清视频97| 日本五十熟hd丰满| 国产精品一区免费视频| 亚洲欧美精品在线观看| 一区二区三区短视频| 精品国产露脸精彩对白| www.超碰在线观看| 美女视频黄免费的久久| 日本不卡一区二区三区在线观看| av小说在线播放| 日韩美一区二区三区| 99re6热在线精品视频| 天堂一区二区在线免费观看| 久久99精品久久久久久青青日本| 色呦呦视频在线观看| 欧美日韩国产中文| 国产破处视频在线观看| 日欧美一区二区| 欧美日韩精品不卡| 成人短视频app| 日韩成人在线视频观看| 影音先锋亚洲天堂| 99精品久久只有精品| 91精品国产入口在线| 加勒比av中文字幕| 水蜜桃久久夜色精品一区| 国产精品白嫩初高中害羞小美女| 水莓100国产免费av在线播放| 午夜影院在线观看欧美| 日韩少妇一区二区| 亚洲精选在线| 麻豆成人小视频| 亚洲v.com| 亚洲色图狂野欧美| 无码视频一区二区三区| 久久毛片高清国产| 成年人免费在线播放| 亚洲+变态+欧美+另类+精品| 7777精品久久久久久| 无码国产伦一区二区三区视频 | 久久人妻无码一区二区| 亚洲午夜免费| 欧美激情视频一区| 深爱激情五月婷婷| 欧美性猛交xxxx偷拍洗澡| 内射中出日韩无国产剧情| 性色一区二区三区| 日本一区二区在线视频观看| 国外成人福利视频| 欧美成人激情在线| 欧美一区二区三区激情| 欧美性猛交xxxx乱大交极品| 国产精品国产三级国产专业不| 奇米四色…亚洲| 91看片淫黄大片91| 欧美激情极品| 国产精品香蕉国产| 手机av在线播放| 亚洲精品电影久久久| 一级黄色av片| 亚洲精品国产一区二区三区四区在线 | 狠狠色伊人亚洲综合网站色| 欧美韩国亚洲| 色综合久久悠悠| 欧美美女色图| 欧美丰满美乳xxx高潮www| 精品少妇久久久久久888优播| 91蜜桃在线观看| 一个色综合久久| 亚洲深爱激情| 伊人久久青草| 秋霞蜜臀av久久电影网免费| 国产精品嫩草影院久久久| 视频在线这里都是精品| 亚洲最新av在线| 99久久99精品| 影视一区二区三区| 久久天天躁狠狠躁夜夜躁 | 亚洲男男av| 97精品国产97久久久久久春色| 国产毛片在线看| 精品国产伦一区二区三区免费| 欧美一区二区三区不卡视频| 亚洲另类中文字| 亚洲精品国产精品国自产网站| 国产精品白丝jk黑袜喷水| 日本一本二本在线观看| 在线精品国产| 婷婷精品国产一区二区三区日韩| 97se亚洲| 亚洲精品日韩av| av成人在线看| 欧美在线亚洲在线| 女同视频在线观看| y97精品国产97久久久久久| 欧美黄色小说| 亚洲福利视频网站| 亚洲视频在线免费播放| 一本大道久久精品懂色aⅴ| 久久久久久久久久一区二区三区| 国产精品成人在线观看| 亚洲一区二区三区四区五区六区| 国产麻豆精品theporn| 老司机午夜av| 先锋影音久久久| 成人性免费视频| 欧美激情自拍| 自拍偷拍一区二区三区| 欧美精品乱码| 欧美色欧美亚洲另类七区| 久久免费视频66| 国产伦精品一区二区三区| 精品一区二区三区中文字幕| 国产欧美一区二区| 九九热这里有精品| 国产精品一区久久久| 99久久精品一区二区成人| 日本在线精品视频| 成人小电影网站| 欧美专区福利在线| 色偷偷色偷偷色偷偷在线视频| 久久久久亚洲精品| 金瓶狂野欧美性猛交xxxx| 欧美第一页在线| 欧洲黄色一区| 久久久久久999| 国产精品一品| 97精品视频在线播放| 国产777精品精品热热热一区二区| 欧美激情精品久久久久久久变态| 午夜伦理大片视频在线观看| 大胆人体色综合| 日韩激情av| 久久久人成影片一区二区三区观看| 国产裸体舞一区二区三区| 欧美久久影院| 一卡二卡三卡视频| 99精品欧美| 日韩视频在线免费看| 日韩avvvv在线播放| 在线黄色免费看| 国产美女精品在线| 无码人妻aⅴ一区二区三区玉蒲团| 国产激情精品久久久第一区二区| 久久久精品人妻一区二区三区| 成人18精品视频| 亚洲黄色小说视频| 综合中文字幕亚洲| 久久久久亚洲天堂| 日韩欧美成人精品| 中文在线资源天堂| 日韩午夜在线观看| 色香蕉在线视频| 国产亚洲欧美另类中文| 免费av网站在线看| 欧美黑人极品猛少妇色xxxxx| 美女扒开腿让男人桶爽久久软| 国产91在线播放九色快色| 免费成人毛片| 懂色中文一区二区三区在线视频| 欧美一级三级| 天天综合色天天综合色hd| 在线中文一区| 国产精品裸体瑜伽视频| 日韩高清在线电影| 超碰人人cao| 久久久www成人免费毛片麻豆| 顶臀精品视频www| 日韩欧美亚洲范冰冰与中字| 一级α片免费看刺激高潮视频| 日韩一级免费观看| 国产天堂在线| 久久久女女女女999久久| 日韩精品一区二区三区av| 91国产在线播放| 国产日产精品_国产精品毛片| 美国av在线播放| 亚洲欧美日韩国产| 欧美高清精品一区二区| 国产三级精品三级| 欧美黑人一级片| 欧美视频你懂的| 天天爱天天干天天操| 伦理中文字幕亚洲| 亚洲天堂一区二区| 国产精品久久一区二区三区| japanese国产精品| 欧美在线一区视频| 激情久久久久久久久久久久久久久久| 污片免费在线观看| 亚洲精品免费看| 亚洲天堂aaa| 亚洲毛片在线免费观看| 亚洲婷婷噜噜| 国产日本欧美一区二区三区在线| 国产精品白浆| 乱子伦一区二区| 麻豆视频观看网址久久| 成人免费无码大片a毛片| 一区二区三区国产| 国产精品高潮呻吟AV无码| 久久99这里只有精品| www亚洲成人| 2023国产一二三区日本精品2022| 九九久久免费视频| 91精品蜜臀在线一区尤物| 成年人视频在线观看免费| 91精品国产网站| 大陆精大陆国产国语精品| 日韩视频在线观看视频| 青青草97国产精品免费观看| 亚洲精品乱码久久久久久久| 亚洲一区二三区| 精品人妻一区二区三区蜜桃| 久久精品国产2020观看福利| 久久精品嫩草影院| 丝袜足脚交91精品| 日韩国产欧美视频| jizz中文字幕| 91福利视频网站| 九色在线视频蝌蚪| 日本中文字幕不卡免费| 精品在线99| 成人精品视频一区二区| 久久精品人人做人人爽97| 亚洲不卡视频在线观看| 亚洲毛片一区二区| 日韩色淫视频| 亚洲精品国产一区| 久久国产精品第一页| 91n在线视频| 91精品国产综合久久精品性色| 国产日产一区二区三区| 91成人伦理在线电影| 欧美日本精品| 亚洲一区二区在线免费| 欧美日韩另类字幕中文| 天堂在线中文| 国产精品久久久久久影视| 日韩成人精品一区| 欧美专区第二页| 亚洲一区二区三区在线| 三级在线播放| 国产精品色悠悠| 综合久久十次| 91视频在线免费| 欧美性少妇18aaaa视频| 超碰国产在线| 97netav| 亚洲深夜av| 国产成人精品视频免费| 日韩一区二区免费电影| 国产中文在线播放| 神马影院我不卡午夜| 国产乱人伦偷精品视频不卡| 精品成人久久久| 亚洲一区www| 精品国产一级| 六月丁香婷婷激情| 国产精品色在线观看| www.欧美国产| 日韩免费在线免费观看| 欧美激情偷拍自拍| 亚洲一区二区在线免费| 欧美性感一区二区三区| 欧美性爽视频| 亚洲激情图片| 成人av先锋影音| 亚洲图片小说视频| 午夜精品在线视频| 成人写真视频| 亚洲日本久久久| 欧美日韩一区二区三区在线 | 一区二区三区波多野结衣在线观看| 色窝窝无码一区二区三区| 国产精品美女www爽爽爽视频| 欧美日韩亚洲一区在线观看| 亚洲精品视频一二三| 成人激情诱惑| 性久久久久久久久久久| 91精品国产综合久久精品性色|