成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 異步的SQL數(shù)據(jù)庫封裝詳解

異步的SQL數(shù)據(jù)庫封裝詳解

熱門標(biāo)簽:南京怎么申請400這種電話 真3地圖標(biāo)注 南通智能外呼系統(tǒng)怎么樣 臺灣外呼系統(tǒng)軟件 地圖標(biāo)注跑線下市場 樂昌電話機器人 疫情時期電話機器人 地圖標(biāo)注可以編輯地名嗎 濮陽清豐400開頭的電話申請

引言

我一直在尋找一種簡單有效的庫,它能在簡化數(shù)據(jù)庫相關(guān)的編程的同時提供一種異步的方法來預(yù)防死鎖。

我找到的大部分庫要么太繁瑣,要么靈活性不足,所以我決定自己寫個。

使用這個庫,你可以輕松地連接到任何 SQL-Server 數(shù)據(jù)庫,執(zhí)行任何存儲過程或 T-SQL 查詢,并異步地接收查詢結(jié)果。這個庫采用 C# 開發(fā),沒有其他外部依賴。

背景

你可能需要一些事件驅(qū)動編程的背景知識,但這不是必需的。

使用

這個庫由兩個類組成:

1、BLL (Business Logic Layer) 提供訪問MS-SQL數(shù)據(jù)庫、執(zhí)行命令和查詢并將結(jié)果返回給調(diào)用者的方法和屬性。你不能直接調(diào)用這個類的對象,它只供其他類繼承.
2、DAL (Data Access Layer) 你需要自己編寫執(zhí)行SQL存儲過程和查詢的函數(shù),并且對于不同的表你可能需要不同的DAL類。
首先,你需要像這樣創(chuàng)建 DAL 類:

namespace SQLWrapper 
{ 
 public class DAL : BLL 
 { 
  public DAL(string server, string db, string user, string pass) 
  { 
   base.Start(server, db, user, pass); 
  } 
 
  ~DAL() 
  { 
   base.Stop(eStopType.ForceStopAll); 
  } 
 
  /////////////////////////////////////////////////////////// 
  // TODO: Here you can add your code here... 
 } 
} 

由于BLL類維護著處理異步查詢的線程,你需要提供必要的數(shù)據(jù)來拼接連接字符串。千萬別忘了調(diào)用`Stop`函數(shù),否則析構(gòu)函數(shù)會強制調(diào)用它。

NOTE:如果需要連接其他非MS-SQL數(shù)據(jù)庫,你可以通過修改BLL類中的`CreateConnectionString`函數(shù)來生成合適的連接字符串。

為了調(diào)用存儲過程,你應(yīng)該在DAL中編寫這種函數(shù):

public int MyStoreProcedure(int param1, string param2) 
{ 
  // 根據(jù)存儲過程的返回類型創(chuàng)建用戶數(shù)據(jù) 
  StoredProcedureCallbackResult userData = new StoredProcedureCallbackResult(eRequestType.Scalar); 
   
  // 在此定義傳入存儲過程的參數(shù),如果沒有參數(shù)可以省略 span style="line-height:1.5;font-size:9pt;">userData.Parameters = new System.Data.SqlClient.SqlParameter[] { /span>     
 new System.Data.SqlClient.SqlParameter("@param1", param1), 
    new System.Data.SqlClient.SqlParameter("@param2", param2), 
  }; 
   
  // Execute procedure... 
  if (!ExecuteStoredProcedure("usp_MyStoreProcedure", userData)) 
    throw new Exception("Execution failed"); 
     
  // 等待執(zhí)行完成... 
  // 等待時長為 userdata.tswaitforresult> 
  // 執(zhí)行未完成返回 timeout> 
  if (WaitSqlCompletes(userData) != eWaitForSQLResult.Success) 
    throw new Exception("Execution failed"); 
     
  // Get the result... 
  return userData.ScalarValue; 
} 

正如你所看到的,存儲過程的返回值類型可以是`Scalar`,`Reader`和`NonQuery`。對于 `Scalar`,`userData`的`ScalarValue`參數(shù)有意義(即返回結(jié)果);對于`NonQuery`,`userData`的 `AffectedRows`參數(shù)就是受影響的行數(shù);對于`Reader`類型,`ReturnValue`就是函數(shù)的返回值,另外你可以通過 `userData`的`resultDataReader`參數(shù)訪問recordset。

再看看這個示例:

public bool MySQLQuery(int param1, string param2) 
{ 
  // Create user data according to return type of store procedure in SQL(這個注釋沒有更新,說明《注釋是魔鬼》有點道理) 
  ReaderQueryCallbackResult userData = new ReaderQueryCallbackResult(); 
   
  string sqlCommand = string.Format("SELECT TOP(1) * FROM tbl1 
   WHERE code = {0} AND name LIKE apos;%{1}%apos;", param1, param2); 
   
  // Execute procedure... 
  if (!ExecuteSQLStatement(sqlCommand, userData)) 
    return false; 
     
  // Wait until it finishes... 
  // Note, it will wait (userData.tsWaitForResult) 
  // for the command to be completed otherwise returns timeout> 
  if (WaitSqlCompletes(userData) != eWaitForSQLResult.Success) 
    return false; 
     
  // Get the result... 
  if(userData.resultDataReader.HasRows  userData.resultDataReader.Read()) 
  { 
    // Do whatever you want.... 
    int field1 = GetIntValueOfDBField(userData.resultDataReader["Field1"], -1); 
    string field2 = GetStringValueOfDBField(userData.resultDataReader["Field2"], null); 
    Nullabledatetime> field3 = GetDateValueOfDBField(userData.resultDataReader["Field3"], null); 
    float field4 = GetFloatValueOfDBField(userData.resultDataReader["Field4"], 0); 
    long field5 = GetLongValueOfDBField(userData.resultDataReader["Field5"], -1); 
  } 
  userData.resultDataReader.Dispose(); 
   
  return true; 
} 

在這個例子中,我們調(diào)用 `ExecuteSQLStatement` 直接執(zhí)行了一個SQL查詢,但思想跟 `ExecuteStoredProcedure` 是一樣的。

我們使用 `resultDataReader` 的 `.Read()` 方法來迭代處理返回的結(jié)果集。另外提供了一些helper方法來避免疊代中由于NULL字段、GetIntValueOfDBField 等引起的異常。

如果你要執(zhí)行 SQL 命令而不是存儲過程,需要傳入 ExecuteSQLStatement 的 userData 有三類:

1、ReaderQueryCallbackResult userData:適用于有返回recordset的語句,可以通過userData.resultDataReader獲得對返回的recordset的訪問。
2、NonQueryCallbackResult userData:適用于像UPDATE這種沒有返回內(nèi)容的語句,可以使用userData.AffectedRows檢查執(zhí)行的結(jié)果。
3、ScalarQueryCallbackResult userData:用于查詢語句只返回一個標(biāo)量值的情況,例如`SELECT code FROM tbl WHEN ID=10`,通過userData.ScalarValue 取得返回的結(jié)果。
對于存儲過程,只有一種需要傳入 ExecuteStoredProcedure 的數(shù)據(jù)類型。但在聲明變量時你需要指明存儲過程的返回值類型:

StoredProcedureCallbackResult userData(eRequestType):除了聲明不同外,其他操作與上面相同。
異步地使用代碼

假使你不希望調(diào)用線程被查詢阻塞,你需要周期性地調(diào)用 `WaitSqlCompletes` 來檢查查詢是否完成,執(zhí)行是否失敗。

/// summary> 
/// 你需要周期性地調(diào)用WaitSqlCompletes(userData, 10) 
/// 來查看結(jié)果是否可用! 
/// /summary> 
public StoredProcedureCallbackResult MyStoreProcedureASYNC(int param1, string param2) 
{ 
  // Create user data according to return type of store procedure in SQL 
  StoredProcedureCallbackResult userData = new StoredProcedureCallbackResult(eRequestType.Reader); 
   
  // If your store procedure accepts some parameters, define them here, 
  // or you can omit it incase there is no parameter definition 
  userData.Parameters = new System.Data.SqlClient.SqlParameter[] { 
    new System.Data.SqlClient.SqlParameter("@param1", param1), 
    new System.Data.SqlClient.SqlParameter("@param2", param2), 
  }; 
   
  // Execute procedure... 
  if (!ExecuteStoredProcedure("usp_MyStoreProcedure", userData)) 
    throw new Exception("Execution failed"); 
     
  return userData; 
} 

在調(diào)用線程中你需要這樣做:

... 
DAL.StoredProcedureCallbackResult userData = myDal.MyStoreProcedureASYNC(10,"hello"); 
... 
// each time we wait 10 milliseconds to see the result... 
switch(myDal.WaitSqlCompletes(userData, 10)) 
{ 
case eWaitForSQLResult.Waiting: 
 goto WAIT_MORE; 
case eWaitForSQLResult.Success: 
 goto GET_THE_RESULT; 
default: 
 goto EXECUTION_FAILED; 
} 
... 

數(shù)據(jù)庫狀態(tài)

在 BLL 中只有一個異步地提供數(shù)據(jù)庫狀態(tài)的事件。如果數(shù)據(jù)庫連接被斷開了(通常是由于網(wǎng)絡(luò)問題),OnDatabaseStatusChanged 事件就會被掛起。

另外,如果連接恢復(fù)了,這個事件會被再次掛起來通知你新的數(shù)據(jù)庫狀態(tài)。

有趣的地方

在我開發(fā)代碼的時候,我明白了連接字符串中的連接時限(connection timeout)和SQL命令對象的執(zhí)行時限(execution timeout)同樣重要。

首先,你必須意識到最大容許時限是在連接字符串中定義的,并可以給出一些執(zhí)行指令比連接字符串中的超時時間更長的時間。

其次,每一個命令都有著它們自己的執(zhí)行時限,在這里的代碼中默認(rèn)為30秒。你可以很容易地修改它,使它適用于所有類型的命令,就像這樣:

userData.tsWaitForResult = TimeSpan.FromSeconds(15); 

以上就是異步的SQL數(shù)據(jù)庫封裝全部過程,希望對大家的學(xué)習(xí)有所幫助。

您可能感興趣的文章:
  • ASP.NET封裝的SQL數(shù)據(jù)庫訪問類
  • c#異步讀取數(shù)據(jù)庫與異步更新ui的代碼實現(xiàn)
  • C#實現(xiàn)異步連接Sql Server數(shù)據(jù)庫的方法

標(biāo)簽:馬鞍山 南京 河北 阿里 廣安 福建 通遼 陜西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《異步的SQL數(shù)據(jù)庫封裝詳解》,本文關(guān)鍵詞  異步,的,SQL,數(shù)據(jù)庫,封裝,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《異步的SQL數(shù)據(jù)庫封裝詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于異步的SQL數(shù)據(jù)庫封裝詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久精品中文字幕免费mv| 亚洲美女av电影| 日本一区二区免费高清视频| 草草久视频在线观看电影资源| 国产麻豆剧果冻传媒观看hd高清| 久久五月天色综合| 美女胸又www又黄的网站| 日韩一区二区免费视频| 亚洲精品亚洲人成人网在线播放| 一区二区三区高清国产| 久久亚洲精品毛片| 国产精品精品软件男同| 六月婷婷综合网| 日韩精品一区二区三区在线观看| 无码国产精品96久久久久| 亚洲大胆人体视频| caoporn免费在线| 韩日毛片在线观看| 制服下的诱惑暮生| 亚洲国产天堂久久综合| 亚洲欧美日韩久久| 国产aⅴ精品一区二区三区色成熟| 中文字幕第五页| 欧美国产在线观看| 精品3atv在线视频| 男裸体无遮挡网站| 亚洲夜夜综合| 国产在线精品一区二区中文| 国产91综合网| 97av在线播放| 欧美三级电影一区二区三区| 男女免费观看在线爽爽爽视频| 麻豆精品在线看| 国内精品免费午夜毛片| 欧美啪啪一区| 亚洲人成网站在线| 粉嫩av四季av绯色av第一区| 亚洲毛片视频| 国产精品萝li| 日韩三区在线| 成人欧美一区二区三区在线湿哒哒| 亚洲欧美另类久久久精品| 亚洲黄色在线观看| a在线观看网站| 日韩理论片一区二区| 韩国欧美国产一区| 精品国产一区久久久| 色视频在线看| av午夜电影| 日韩视频一二三| a级片免费观看| 亚洲第一av在线| 午夜不卡av免费| 热re99久久精品国99热蜜月| 日韩手机在线视频| 欧美性xxxxx| 成人欧美一区二区三区视频xxx| 色爱区综合激月婷婷| 亚洲视频999| 国产一区二区你懂的| 狠狠操视频网| 欧美高清xxxx性| 91久久中文| 欧美韩国亚洲| 欧美国产精品中文字幕| 亚洲美女久久| 色噜噜一区二区| 精品久久久久久无| 激情婷婷综合网| 国产日本欧美一区二区三区| 亚洲欧美电影| 国产香蕉97碰碰久久人人| 久久超碰97人人做人人爱| 亚洲情趣在线观看| 日日操免费视频| 8x8ⅹ国产精品一区二区二区| 日本高清视频免费在线观看| 国产福利免费观看| 黑人极品ⅴideos精品欧美棵| 国产精品亚洲一区二区三区妖精| 成人国产精品免费观看| 超碰精品一区二区三区乱码| www.午夜激情| 国产精品视区| 青青草成人网| 亚洲精品mp4| 午夜欧美精品久久久久久久| av在线你懂的| 亚洲av无码一区二区三区在线| 99久久婷婷国产| 福利一区二区三区四区| 成人影院免费观看| 欧美日韩性视频| 久久久美女毛片| 九九热视频免费观看| 成人免费自拍视频| 思热99re视热频这里只精品| 亚洲最大成人在线观看| 毛片基地网站| 日本国产在线| 一本一本大道香蕉久在线精品| 亚洲欧美日本在线| 亚洲午夜一区二区三区| 一道本无吗dⅴd在线播放一区| 亚洲精品一区二区三区影院忠贞| 夜级特黄日本大片_在线| 亚洲日本一区二区三区在线不卡| 天堂av资源在线观看| 扒开jk护士狂揉免费| 欧美性受黑人性爽| 欧美精品xxx| 中文字幕一区二区三区免费看| 欧美小视频在线观看| 欧美日韩亚洲网| 久久久久久av无码免费看大片| 伊人网在线观看| 国产日产精品久久久久久婷婷| 中文字幕日韩欧美精品在线观看| 777奇米四色成人影色区| 欧美精品一区二区三区四区五区| 一区视频在线播放| 亚洲无人区码一码二码三码的含义| 无遮挡动作视频在线观看免费入口| 性感美女一级片| 日韩成人一级大片| 一区二区三区在线观看av| 动漫精品一区二区| 日本dhxxxxxdh14日本| 欧美日韩伦理片| 美女免费黄视频网站| www.5588.com毛片| 日韩精品一区国产麻豆| 精品视频www| 欧美日韩在线观看一区| 五月激情婷婷在线| 粉嫩老牛aⅴ一区二区三区| 日本精品一区二区三区在线观看视频| 2023av视频| 嫩草影院入口一二三| 亚洲一区国产视频| 国产精品538一区二区在线| 天天夜碰日日摸日日澡性色av| 日韩视频在线观看免费视频| 性欧美大战久久久久久久免费观看| 欧美日韩综合在线观看| 91丨porny丨在线| 亚洲直播在线一区| 欧美www视频| 91美女在线观看| 中国成人亚色综合网站| 99久久精品免费看| 毛片网站在线免费观看| 日韩精品视频在线免费观看| 国产精品免费视频观看| 久久精品视频16| 亚洲综合中文字幕68页| 7777女厕盗摄久久久| 成熟亚洲日本毛茸茸凸凹| 成人三级视频在线观看一区二区| 7878视频在线观看| 99视频国产精品| 久久九九99| 日韩精品欧美一区二区三区| 少妇精品一区二区| 亚洲综合成人网| 性久久久久久久| 亚洲天堂网一区| 资源网第一页久久久| 成人福利在线| 一个人看的免费视频色| 口述被爽到呻吟高潮自述| 99在线|亚洲一区二区| 永久免费看片在线观看| 久久亚洲电影天堂| 欧美被日视频| 亚洲熟女乱综合一区二区三区| 亚洲精品乱码久久久久久动漫| 欧美大人香蕉在线| 国产亚洲精品美女久久| www.国产在线| jizzjizzjizz欧美| 国产午夜久久av| 久久人人超碰精品| 成年人观看网站| 日本五十肥熟交尾| 欧美一级生活片| 亚洲精品国产视频| 欧美日韩一区二区电影| 狠狠97人人婷婷五月| 91精品国产色综合久久不卡电影| 91精品国产综合久| 在线视频三区| 51xx午夜影福利| 亚洲911精品成人18网站| 精品国产第一区二区三区观看体验| 国产精品大片wwwwww| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久精品视频16| 日本欧美在线| 91成人在线免费观看| a成人v在线| 亚洲日本久久久| 麻豆精品视频在线观看| 国产在线a视频| 视频免费在线看| 亚洲午夜精品一区二区三区他趣| 日本久久伊人| 国产xxxxx在线观看| 5858p先锋影音资源网| 国产91丝袜美女在线播放| 欧美高清videos高潮hd| 激情综合亚洲精品| 久草视频免费播放| 免费看成一片| 亚洲av成人精品毛片| 鲁鲁狠狠狠7777一区二区| 国模精品一区二区| 动漫3d精品一区二区三区乱码| 九九在线观看视频| 国产精品久久久久久麻豆一区软件| 欧美午夜精品伦理| 国产免费不卡视频| 男人草女人视频| 国产在线一区二区三区欧美| 精品一区二区三区中文字幕视频| 韩日精品中文字幕| 国产喷白浆一区二区三区| 国产乱子轮精品视频| 久久亚洲AV无码| 青青青在线视频| 欧美丝袜丝交足nylons| 久久久久狠狠高潮亚洲精品| 国产福利在线免费| 国产精品老牛影院在线观看| 精品一区二区三区无码视频| 日韩 欧美 综合| 国产手机精品在线| 蜜臀av午夜一区二区三区| 国产农村妇女毛片精品| 深田咏美中文字幕| 色一情一乱一区二区| 黑人精品xxx一区一二区| 伊人色**天天综合婷婷| 欧美一级视频在线观看| 国产精品嫩草影院一区二区| 91影视免费在线观看| 九七电影院97理论片久久tvb| 3d黄动漫网站| 深夜av在线| 精品人人人人| 一区二区成人| 日韩资源av在线| 国产一区二区三区奇米久涩| 91夜夜未满十八勿入爽爽影院| 日韩欧美成人午夜| 任你操视频在线观看| 国产性猛交96| 国产日韩精品一区二区| 欧美老女人在线| 在线观看不卡的av| 欧美刺激性大交免费视频| 国产大尺度在线观看| 91麻豆精品国产综合久久久| 视频在线观看免费高清| 免费特级黄色片| 国产精品免费观看在线| 97人人模人人爽人人澡| 欧美日韩福利在线观看| 欧美精品 日韩| 蜜桃视频www网站在线观看| 国产精品乱子伦| 国产一区二区主播在线| 50一60岁老妇女毛片| av天堂一区二区| 欧美日韩福利在线观看| 日本一区二区在线视频| 先锋男人资源站| 人妻夜夜爽天天爽| 激情五月六月婷婷| 欧美孕妇孕交黑巨大网站| 在线色视频网| 亚洲网站视频在线观看| 99reav2| 国产精品丝袜xxxxxxx| 欧美一区二区在线观看视频| 在线日韩国产精品| 色婷婷狠狠综合| 日韩美女主播在线视频一区二区三区| 亚洲欧美日韩色图| 精品国语对白精品自拍视| 最新亚洲国产精品| 91亚洲国产成人久久精品| 视频一区中文字幕| 亚洲激情婷婷| 日本午夜免费一区二区| 人人精品久久| 美女的胸无遮挡在线观看| 欧美乱大交xxxxx另类电影| 国产精品一区二区三区四| 无码粉嫩虎白一线天在线观看| 欧美一区二区三区小说| 动漫av一区| 色综合天天天天做夜夜夜夜做| 国产视频九色蝌蚪| xxxxhd欧美精品| 在线观看欧美日韩| 亚洲精品精品一区| 91porn在线| 亚洲综合视频在线观看| 91国产一区| 嫩草视频在线免费观看| 精品999成人| 不卡av在线播放| 日韩在线你懂的| 99re6这里只有精品| 作爱视频免费观看视频在线播放激情网| 欧美三区四区| 免费看的黄色大片| 不卡av电影在线观看| 999香蕉视频| www.av麻豆| 特黄特色大片免费视频大全| 国产极品人妖在线观看| 色综合久久久| 欧美一区深夜视频| 深夜影院在线观看| 亚洲精品97久久| 午夜精品一区在线观看|