中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

ado.net快速上手疑問及解答
來源:易賢網 閱讀:1345 次 日期:2014-08-20 13:57:39
溫馨提示:易賢網小編為您整理了“ado.net快速上手疑問及解答”,方便廣大網友查閱!

一、代碼中的問題

1、偽SqlMapper的基類為什么用抽象類BaseSqlMapper而不用接口?

答:樓豬也知道在IBatis下的SqlMapper的基類就是一個接口ISqlMapper,但是樓豬寫代碼的時候,發現泛型約束在抽象基類里寫一次,在SqlMapper下就不要再寫了,而用接口就必須寫兩遍約束。呵呵,一時偷懶的后果,沒有深刻意識到“針對接口編程”這一條常識,提出這個問題的童鞋明顯可以看出技高樓豬一籌啊,,哈哈,樓豬吸取這個教訓了,本文最后的demo樓豬將BaseSqlMapper統一換成了ISqlMapper接口,請留意。

2、在前臺頁面里面寫SQL語句太多,是不是不太好?

這個問題也很好。在實際的項目中,SQL語句通常都寫在具體的Dao文件中,比如前文demo中提到的PersonDao類。我們在添加一個Person的時候,示例中是通過view plaincopy to clipboardPRint?

public int Insert(string sqlInsert)

public int Insert(string sqlInsert)

這種形式的方法執行插入的,但是在實際項目中的時候,我們通常都會寫view plaincopy to clipboardprint?

public int Insert(Person model)

public int Insert(Person model)

這種類型的方法執行數據庫插入操作。所以在前臺(表現層)寫SQL語句其實是不合理的。再次多多感謝指出代碼問題的童鞋們。如果已經對某些新手造成某些誤導,樓豬在這里要深刻反省和檢討(demo寫的明顯有點隨意和偷懶),在這里,樓豬鄭重提醒,SQL語句的位置請不要模仿demo中這種糟糕的寫法,樓豬也是過來人,因為使用Batis.net的時候都是放在Dal層xml下的,請務必重視起來。

二、疑問(直接摘錄郵件內容)

1、“數據庫切換貌似沒有是吧.怎樣切換MSSQL。ACC,XML等等呢”?

答:這個應該是說源碼對多種數據庫的支持問題。哦,樓豬還沒有實現。看源碼,Sql Server簡單的基本的CRUD功能已經支持了。如果要擴展支持其他數據庫,模仿SqlServer類里的具體實現即可。樓豬的機器環境上沒有安裝Oracle或者MySQL等數據庫,所以寫完了也不好測試。您如果條件具備,自己可以試著完成它。至于說數據庫的切換,理想狀態的實現莫過于最經典的抽象工廠模式,呵呵,配置文件配合反射就行了。但是樓豬建議您簡單使用偽SqlMapper進行數據庫類型切換。具體操作,其實只要在配置文件appsetting中加一個數據庫類型節點sqlType,配合類里的常用數據庫類型的枚舉即可。

<appSettings>

<add key="db_timeOut" value="5000"/>

<!--數據庫類型 0 SqlServer 1 Orcale 2 MySql-->

<add key="sqlType" value="0"/>

</appSettings>

枚舉如下:

代碼

namespace AdoNetDataaccess.Mapper

{

public enum SqlEnum

{

Default = 0,

SQLServer = 0,

Oracle = 1,

MySql = 1

}

}

然后,就是一些實例化SqlMapper的過程判斷了,將數據庫切換的問題完全轉移到實例化SqlMapper上來:

代碼

using System;

using System.Collections.Generic;

using System.Configuration;

namespace AdoNetDataAccess.Mapper

{

using AdoNetDataAccess.Core.Contract;

using AdoNetDataAccess.Core.Implement;

#region enum

public enum SqlEnum

{

Default = 0,

SQLServer = 0,

Oracle = 1,

MySql = 1

}

#endregion

public sealed class MapperUtill

{

#region fields

public static string currentSqlKey = "sqlConn";

public static int cmdTimeOut = 15;

private static int sqlType = 0;//數據庫類型 0 SqlServer 1 Orcale 2 MySql

private static readonly object objSync = new object();

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

#endregion

#region constructor and methods

private MapperUtill()

{

}

static MapperUtill()

{

try

{

cmdTimeOut = int.Parse(ConfigurationManager.AppSettings["db_timeOut"]);

}

catch

{

cmdTimeOut = 15;

}

try

{

sqlType = int.Parse(ConfigurationManager.AppSettings["sqlType"]);

}

catch (Exception ex)

{

throw ex;

}

//實例化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 ISqlMapper GetSqlMapper(string key)

{

return MapperUtill.GetMapper(key);

}

public static ISqlMapper GetCurrentSqlMapper()

{

return MapperUtill.GetMapper(currentSqlKey);

}

public static void CreateMapper(string connKey, string sqlConStr, int connTimeOut)

{

IDbOperation operation = null;

switch (sqlType)

{

default:

case 0:

operation = new SqlServer(sqlConStr, connTimeOut);

break;

case 1:

//operation = new Orcale(sqlConStr, connTimeOut);//Orcale 未實現

break;

case 2:

//operation = new MySql(sqlConStr, connTimeOut);//MySql 也沒有實現呢

break;

}

if (operation == null)

{

throw new Exception("您配置的數據庫類型有可能那啥出問題了");

}

SqlMapper mapper = new SqlMapper(operation);

dictMappers.Add(connKey.ToUpper().Trim(), mapper);//不區分大小寫

}

public static ISqlMapper GetMapper(string sqlConKey)

{

if (string.IsNullOrEmpty(sqlConKey))

{

throw new Exception("數據庫連接字符串主鍵為空!");

}

sqlConKey = sqlConKey.ToUpper();//不區分大小寫

ISqlMapper 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, ISqlMapper> kv in dictMappers)

{

SqlMapper mapper = kv.Value as SqlMapper;

if (mapper == null)

{

continue;

}

mapper.CurrentDbOperation.CloseConnection();

}

dictMappers.Clear();

}

#endregion

}

}

必須要注意,這里的數據庫切換方式不是絕對的,您可以按照自己喜歡的習慣的其他方式編程完成切換,樓豬這里只是拋磚而已。

2、“我對ORM不熟悉,想問下您的這個ORM到底是節省了哪部分工作? 我看里面有大量的反射,這樣是不是非常影響效率?”

首先,樓豬對ORM也不太熟悉。現在實現的這個嚴格來說也根本談不上算是ORM,但是有樓豬自己使用過的兩個ORM的影子。

其次,當前實現的東東不是為了節省哪部分工作而設計的,樓豬的初衷是重讀ado.net經典紅皮書而做的復習筆記。

第三,反射相對于沒有使用反射,當然非常影響效率。需要說明的是,要不要使用反射應該根據實際的項目需要。根據樓豬個人開發經驗,對于大多數程序員要實現的簡單的常見的前后臺mis系統,在保證基本需求的情況下,客戶如果對效率沒有意見,用用沒有太大關系,大部分工作就交給服務器完成去吧,程序員不用做太多工作。但是對于訪問頻繁的大型網站,實時系統或者應對大數據量操作的系統等等,建議不要使用反射,而且可能要重點花精力在數據“裝潢”上面。

最后,如果有童鞋對ORM感興趣,不妨在網上搜搜大牛們的作品,大名鼎鼎的NHibernate,iBatis.net,WebSharp,LINQ等等(這么多ORM,一個一個都要熟悉,源碼也研究不過來啊,建議新手熟練一兩種足矣),也許對您有更多的啟發。如果您自己實現了類似其他流行ORM的主流功能(如自動生成SQL語句或者通過XML配置,緩存,延遲加載等等),并且功能更加強大,用起來更加順手方便的新ORM,呵呵,真誠期待您的功德圓滿那一天早日到來,快點來造福萬千程序員吧。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:ado.net快速上手疑問及解答
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
美女日韩欧美| 欧美一区二区三区免费看| 欧美日韩精品免费观看| 蜜桃av噜噜一区| 亚洲国产欧美一区二区三区丁香婷| 欧美日韩国产黄| 亚洲午夜一区二区| 欧美日韩综合精品| 国产一区二区三区四区老人| 国产精品视频网站| 久久精品视频网| 一区二区三区精密机械公司| 国产精品v亚洲精品v日韩精品| 亚洲精品视频在线观看免费| 香港久久久电影| 国内精品一区二区三区| 欧美国产极速在线| av不卡在线| 国产亚洲精品福利| 欧美日韩中文字幕日韩欧美| 亚洲国产女人aaa毛片在线| 欧美亚洲免费高清在线观看| 91久久综合| 国产一区二区三区网站 | 狠狠色综合色综合网络| 久久人91精品久久久久久不卡| 亚洲午夜精品一区二区| 欧美日韩综合一区| 免费欧美在线视频| 久久九九免费视频| 久久久久综合网| 欧美日韩国产成人| 久久野战av| 亚洲视频福利| 亚洲日本成人| 欧美日韩亚洲国产一区| 亚洲女同精品视频| 亚洲激情一区二区三区| 欧美日韩精品在线视频| 国产精品黄色在线观看| 亚洲精品一区二区三| 欧美日韩综合视频| 亚洲人久久久| 国产一区999| 欧美精品久久一区| 久久久久久夜| 欧美一区二区免费观在线| 亚洲欧洲精品一区二区精品久久久| 国产精品久久二区| 蜜臀av性久久久久蜜臀aⅴ| 欧美私人啪啪vps| 国产在线精品一区二区中文| 欧美国产日韩一区二区三区| 一本色道久久加勒比精品| 亚洲精品一区二区网址| 亚洲国产激情| 午夜精品久久久久久久白皮肤 | 在线日韩欧美视频| 国产精品视频1区| 欧美日韩午夜视频在线观看| 欧美h视频在线| 欧美视频在线观看一区| 一区二区三区色| 亚洲人成小说网站色在线| 亚洲黄网站在线观看| 亚洲免费在线视频| 午夜精品av| 欧美日韩伦理在线| 亚洲综合色丁香婷婷六月图片| 亚洲欧美激情一区二区| 欧美电影资源| 国产欧美日韩亚洲精品| 性色av一区二区三区红粉影视| 久久狠狠久久综合桃花| 国产精品久久久久永久免费观看 | 国模一区二区三区| 国产精品福利在线| 欧美日韩高清区| 国产精品视频yy9299一区| 久久久亚洲一区| 好看的日韩av电影| 欧美成人免费在线视频| 久久婷婷人人澡人人喊人人爽| 国产精品xvideos88| 日韩亚洲国产欧美| 国产一区二区三区高清播放| 国产精品一区免费观看| 亚洲国产高清自拍| 黑人巨大精品欧美黑白配亚洲| **欧美日韩vr在线| 久久久7777| 在线精品在线| 亚洲另类在线视频| 欧美激情第10页| 国产日韩欧美在线一区| 欧美freesex交免费视频| 亚洲成人资源| 午夜欧美大尺度福利影院在线看| 欧美视频一区二区三区四区| 国产精品videossex久久发布| 另类综合日韩欧美亚洲| 欧美激情导航| 91久久精品国产91性色tv| 欧美人体xx| 亚洲午夜三级在线| 国产精品系列在线| 男女视频一区二区| 亚洲欧美日韩精品久久久| 欧美精品高清视频| 日韩系列在线| 国产一区二区三区黄| 欧美日本亚洲视频| 欧美性猛交xxxx免费看久久久 | 欧美视频中文字幕| 国内外成人免费激情在线视频网站 | 老巨人导航500精品| 欧美韩日一区| 国产精品国产三级国产aⅴ浪潮| 午夜精品久久久久久久久久久久 | 另类天堂av| 亚洲精品久久久蜜桃| 国产在线观看一区| 欧美日韩亚洲一区二区三区四区 | 国产日韩精品一区| 久久久久一区二区三区| 狠狠色综合播放一区二区 | 午夜精品久久久久久99热软件 | 国产精品日韩精品| 日韩视频在线一区二区| 欧美久久婷婷综合色| 亚洲欧美日本视频在线观看| 亚洲激情网站| 欧美午夜免费影院| 狠狠色丁香婷婷综合| 国产精品区一区二区三区| 久久午夜国产精品| 欧美一级二区| 亚洲图片欧洲图片av| 亚洲丰满在线| 亚洲一二三区在线| 欧美日韩国产欧美日美国产精品| 久久久精品五月天| 欧美亚洲三区| 亚洲一区国产精品| 欧美视频专区一二在线观看| 午夜电影亚洲| 亚洲午夜在线观看| 亚洲乱码国产乱码精品精98午夜| 亚洲第一网站免费视频| 欧美三级乱码| 国产伦精品一区二区三区四区免费| 欧美系列电影免费观看| 欧美激情第1页| 国产精品99免费看| 欧美另类videos死尸| 国产精品一区二区视频| 国产精品亚洲欧美| 欧美大片网址| 国产真实乱偷精品视频免| 久久久www成人免费毛片麻豆| 性欧美大战久久久久久久久| 99国产一区| 一区二区三区四区国产精品| 欧美先锋影音| 欧美91视频| 久久久久久伊人| 亚洲自拍电影| 亚洲天堂av在线免费观看| 在线日韩日本国产亚洲| 亚洲视频电影图片偷拍一区| 羞羞视频在线观看欧美| 国产亚洲一区在线| 在线观看亚洲精品| 日韩写真在线| 久久不射网站| 国产精品豆花视频| 久久婷婷国产综合尤物精品 | 欧美二区视频| 国产精品尤物福利片在线观看| 国产亚洲欧美激情| 亚洲伦理精品| 欧美激情综合色综合啪啪| 国产精品一区=区| 一区二区三区欧美激情| 卡一卡二国产精品| 欧美国产日韩a欧美在线观看| 国产精品日本精品| 亚洲综合色丁香婷婷六月图片| 在线播放中文字幕一区| 亚洲精品在线二区| 久久免费视频在线| 国产精品免费视频观看| 亚洲精品一线二线三线无人区| 久久免费偷拍视频| 国产精品一区二区久久久久| 99在线|亚洲一区二区| 欧美成人嫩草网站| 亚洲高清一区二区三区| 免费久久99精品国产| 在线观看欧美黄色|