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

LINQ to SQL:如何直接執行SQL語句

開發 后端
我們將談到在LINQ to SQL環境下,如何直接執行SQL語句的方法,并發布一張調試圖供大家參考。

1、ExecuteQuery方法

看命名,我們很容易聯想到ADO.NET里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告訴我們這個方法返回的是一個泛型集合,應該“所思非所得”。下面通過一個簡單方法,驗證我們的猜想(數據庫設計可以參考這一篇):

  1. /// <summary>   
  2. /// 直接執行sql語句,獲取總人數   
  3. /// </summary>   
  4. /// <returns></returns>   
  5.  public int GetTotalCount()   
  6. {   
  7.   string strSql = "SELECT COUNT(0) FROM Person(NOLOCK)";   
  8.    var query = dataContext.ExecuteQuery<int>(strSql);   
  9. int result = query.First<int>();   
  10. Console.WriteLine();   
  11. Console.WriteLine("total count:{0}", result);   
  12. return result;   

調試的時候,通過IntelliTrace跟蹤到:

毫無疑問,上面的圖片說明最初的想法是不正確的,”ADO.NET:執行Reader…”云云,讓我們更加堅信它實際執行的應該是ExecuteReader方法。當然最簡單的方法是直接查看它的方法說明:

  1. // 摘要:   
  2. //     直接對數據庫執行 SQL 查詢并返回對象。   
  3. //   
  4. // 參數:   
  5. //   query:   
  6. //     要執行的 SQL 查詢。   
  7. //   
  8. //   parameters:   
  9. //     要傳遞給命令的參數數組。注意下面的行為:如果數組中的對象的數目小于命令字符串中已標識的最大數,
  10. 則會引發異常。如果數組包含未在命令字符串中引用的對象,則不會引發異常。如果某參數為   
  11. //     null,則該參數會轉換為 DBNull.Value。   
  12. //   
  13. // 類型參數:   
  14. //   TResult:   
  15. //     返回的集合中的元素的類型。   
  16.  //   
  17. // 返回結果:   
  18. //     由查詢返回的對象的集合。   
  19. public IEnumerable<TResult> ExecuteQuery<TResult>(string query, params object[] parameters); 

ExecuteQuery方法還有一個非泛型方法:

  1. //   
  2. // 摘要:   
  3. //     直接對數據庫執行 SQL 查詢。   
  4. //   
  5. // 參數:   
  6. //   elementType:   
  7. //       

要返回的 System.Collections.Generic.IEnumerable<T> 的類型。使查詢結果中的列與對象中的字段或屬性相匹配的算法如下所示:如果字段或屬性映射到特定列名稱,則結果集中應包含該列名稱。如果未映射字段或屬性,則結果集中應包含其名稱與該字段或屬性相同的列。通過先查找區分大小寫的匹配來執行比較。如果未找到匹配項,則會繼續搜索不區分大小寫的匹配項。如果同時滿足下列所有條件,則該查詢應當返回(除延遲加載的對象外的)對象的所有跟蹤的字段和屬性:T 

  1. //     是由 System.Data.Linq.DataContext 顯式跟蹤的實體。
  2. System.Data.Linq.DataContext.ObjectTrackingEnabled   
  3. //     為 true。實體具有主鍵。否則會引發異常。   
  4. //   
  5. //   query:   
  6. //     要執行的 SQL 查詢。   
  7. //   
  8. //   parameters:   
  9. //     要傳遞給命令的參數數組。注意下面的行為:如果數組中的對象的數目小于命令字符串中已標識的最大數,
  10. 則會引發異常。如果數組包含未在命令字符串中引用的對象,則不會引發異常。如果某參數為   
  11. //     null,則該參數會轉換為 DBNull.Value。   
  12. //   
  13. // 返回結果:   
  14. //     由查詢返回的對象的 System.Collections.Generic.IEnumerable<T> 集合。   
  15. public IEnumerable ExecuteQuery(Type elementType, string query, params object[] parameters);  
  16.  

看它的參數需要多傳遞一個elementType,明顯不如泛型方法簡潔。

2、ExecuteCommand方法

同樣道理,這個方法立刻讓我們聯想到(世界沒有聯想,生活將會怎樣?),聯想到,等等,不知聯想到什么。然后我們看一下方法使用說明:

  1. //   
  2. // 摘要:   
  3. //     直接對數據庫執行 SQL 命令。   
  4. //   
  5. // 參數:   
  6. //   command:   
  7. //     要執行的 SQL 命令。   
  8. //   
  9. //   parameters:   
  10. //     要傳遞給命令的參數數組。注意下面的行為:如果數組中的對象的數目小于命令字符串中已標識的最大數,
  11. 則會引發異常。如果數組包含未在命令字符串中引用的對象,則不會引發異常。如果任一參數為   
  12. //     null,則該參數會轉換為 DBNull.Value。   
  13. //   
  14. // 返回結果:   
  15. //     一個 int,表示所執行命令修改的行數。   
  16. public int ExecuteCommand(string command, params object[] parameters); 

到這里,看它的返回類型為int,表示執行命令修改的行數,這次很容易想到ExecuteNonQuery方法。對不對呢?通過下面的代碼證明我們的設想:

  1. /// <summary>   
  2. /// 直接執行sql語句 根據用戶Id更新體重   
  3. /// </summary>   
  4. /// <param name="id">用戶Id</param>   
  5. /// <param name="destWeight">更新后的體重</param>   
  6. /// <returns></returns>   
  7. public int ModifyWeightById(int id, double destWeight)   
  8. {   
  9.   string strSql = string.Format("UPDATE Person SET Weight={0} WHERE Id={1}", destWeight, id);   
  10.  int result = dataContext.ExecuteCommand(strSql);   
  11.  Console.WriteLine();   
  12. Console.WriteLine("affect num:{0}", result);   
  13. return result;   

調試過程中,通過IntelliTrace可以很清楚地捕獲:

“ADO.NET:執行NonQuery…”基本可以斷言我們的設想是正確的。

3、防止sql注入

1和2中,執行sql語句的兩個方法都有一個params 類型的參數,我們又會想到ADO.NET非常重要的sql語句的參數化防止sql注入問題。下面通過一個方法,看看linq2sql可不可以防止sql注入。

(1)、直接執行拼接的sql語句(有風險)

  1. /// <summary>   
  2. /// 直接執行sql語句 根據用戶Id更新FirstName   
  3. /// </summary>   
  4. /// <param name="id">用戶Id</param>   
  5. /// <param name="destName">更新后的FirstName</param>   
  6. /// <returns></returns>   
  7. public int ModifyNameById(int id, string destName)   
  8. {   
  9. string strSql = string.Format("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);
  10. //這么拼接有風險   
  11.  int result = dataContext.ExecuteCommand(strSql);   
  12. Console.WriteLine();   
  13. Console.WriteLine("affect num:{0}", result);   
  14.  return result;   
  15.  } 

然后,在客戶端這樣調用這個方法:

  1. int result = ServiceFactory.CreatePersonService().ModifyNameById(10, "'Anders'");
  2. //更新id為10的人的FirstName 

 

運行的時候,直接拋出異常,提示“Anders”附近有語法錯誤。毫無疑問,它執行的sql語句:

  1. UPDATE Person SET FirstName=''Anders'' WHERE Id=10 

是不能通過的,同時證明了string.format函數不能有效防止sql注入。

(2)、直接通過linq方法的參數傳遞,結果如何呢?

改進(1)的傳參方法:

  1. /// <summary>   
  2. /// 直接執行sql語句 根據用戶Id更新FirstName   
  3. /// </summary>   
  4. /// <param name="id">用戶Id</param>   
  5. /// <param name="destName">更新后的FirstName</param>   
  6. /// <returns></returns>   
  7. public int ModifyNameById(int id, string destName)   
  8.  {   
  9. //string strSql = string.Format("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);
  10. //這么拼接有風險   
  11. //int result = dataContext.ExecuteCommand(strSql);   
  12.  string strSql = "UPDATE Person SET FirstName={0} WHERE Id={1}";   
  13. int result = dataContext.ExecuteCommand(strSql, new object[] { destName, id });   
  14. Console.WriteLine();   
  15.  Console.WriteLine("affect num:{0}", result);   
  16.  return result;   

再次通過如下的方式調用:

  1. int result = ServiceFactory.CreatePersonService().ModifyNameById(10, "'Anders'");
  2. //更新id為10的人的FirstName 

這一次運行正常嗎?經測試,真的真的是真的正常,終于可以長松一口氣了。查看數據庫,Id為10的那一條記錄的FirstName結果改變成了“'Anders'”(帶單引號),明白ADO.NET工作原理的都知道這個一點也不神奇,不是嗎?

對比(1)和(2),我們發現還是用linq2sql的源生方法傳參比較好,通過拼接sql應該盡量避免。

到這里,可能你會認為上面1、2、3全是廢話,知道怎么用不就行了嘛?!其實很長一部分時間我也是這么想這么做的。工作久了,早就習慣了不求甚解,現在看書,看園子里高手的博客,多多少少會有點反思。

4、思考

ADO.NET中比較常用的ExecuteScalar方法,在linq2sql應該怎么實現呢?您嘗試使用過了嗎?

原文鏈接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/11/03/1868438.html

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機讀取數據淺析
  3. Linq Lambda表達式全面分析
  4. Linq擴展方法簡單分析
  5. 初探Linq局部變量類型
責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-10 10:37:15

LINQ to SQL

2009-09-09 18:03:47

LINQ to SQL

2009-09-10 18:02:23

LINQ to SQL

2009-09-07 16:25:14

Linq To SQL

2010-09-25 16:21:41

SQL語句

2009-09-16 17:44:54

LINQ to SQL

2010-09-06 11:24:32

SQL Server語句

2009-09-08 14:45:24

Linq to SQL支持SQL Serve

2010-09-06 13:17:19

SQL Server語句

2013-10-29 16:27:23

MySQLSQL語句

2009-09-18 14:33:37

LINQ to SQLSQL命令

2022-07-28 09:13:30

MySQL數據庫

2010-09-25 14:59:54

SQL語句

2009-09-15 17:07:24

Linq To SQL

2009-09-10 11:29:00

LINQ to SQL

2009-09-16 17:33:16

LINQ TO SQL

2009-09-09 14:40:43

Linq to sql

2009-09-11 12:13:40

LINQ to SQL

2009-09-08 13:16:01

Linq to SQL

2009-09-11 12:08:09

Linq to SQL
點贊
收藏

51CTO技術棧公眾號

人妖欧美一区二区| 欧美军人男男激情gay| 亚洲香肠在线观看| 九色91国产| 亚洲一级特黄毛片| 欧美激情1区2区| 亚洲精品美女网站| 亚洲欧美日韩综合网| heyzo高清国产精品| 国产视频一区在线观看| yy111111少妇影院日韩夜片| 免费在线观看黄网站| 成人区精品一区二区婷婷| 日韩美女主播在线视频一区二区三区 | 久久国产日韩欧美精品| 久久91亚洲精品中文字幕| 国产ts丝袜人妖系列视频| 欧美国产视频| 欧美日韩在线第一页| 国产四区在线观看| 国产一区二区三区福利| 成人性生交大合| 国产欧美日韩精品专区| 可以免费看的av毛片| 欧美/亚洲一区| 一区二区三区国产视频| 9.1成人看片| 亚洲精品在线播放| 91精品久久久久久久久99蜜臂| wwwxxx黄色片| 97超碰在线免费| 亚洲欧美电影一区二区| 亚洲国产精品久久久久久女王| 五月天婷婷视频| 国产成人在线网站| 成人黄色av免费在线观看| 无码人妻久久一区二区三区不卡| 影音先锋日韩资源| 成人97在线观看视频| 亚洲色图日韩精品| 欧美激情在线免费| 亚洲剧情一区二区| 亚洲精品中文字幕在线播放| av日韩在线播放| 欧美成人精品高清在线播放| 8x8x成人免费视频| 日本中文字幕视频一区| 欧美网站一区二区| 97公开免费视频| 裤袜国产欧美精品一区| 欧美色图在线视频| 午夜精品久久久久久久无码| 超碰99在线| 午夜精品爽啪视频| av免费观看大全| av日韩中文| 欧美日韩国产限制| 黄www在线观看| 亚洲一区资源| 色婷婷av一区二区三区大白胸| 日本wwww视频| 欧美xnxx| 欧美日韩国产美女| 欧美一级特黄aaa| 国产精品国产三级在线观看| 日韩一区二区在线播放| www.com日本| 欧美电影在线观看免费| 亚洲精品白浆高清久久久久久| 在线xxxxx| 一区二区三区视频免费观看| 亚洲精品在线观看www| 扒开jk护士狂揉免费| 少妇精品久久久| 亚洲一区二区福利| 91ts人妖另类精品系列| 国产精品成人a在线观看| 欧美成人免费观看| 日韩无码精品一区二区三区| 亚洲一卡久久| 国产女同一区二区| 亚洲av无码专区在线| 99精品国产91久久久久久| 欧美日韩天天操| 欧美日本高清| 亚洲国产综合视频在线观看| 激情五月开心婷婷| 啪啪av大全导航福利综合导航| 91精品国产福利| 亚洲成人av免费在线观看| 精品国产乱码久久久久久蜜坠欲下| 日韩中文字在线| 亚欧视频在线观看| 老司机午夜精品| 国产精品午夜av在线| 国产免费av在线| 一区二区三区四区激情| av免费在线播放网站| 精品国产一区二区三区2021| 亚洲精品美女久久久| 亚洲不卡在线播放| 久久激情一区| 99精品在线直播| 国产在线观看免费网站| 亚洲最大的成人av| 午夜精品在线免费观看| 最新国产一区二区| 色老头一区二区三区在线观看| 国产精品a成v人在线播放| 麻豆中文一区二区| 精品国产区在线| 91亚洲天堂| 欧美日韩激情一区| 欧洲女同同性吃奶| 国产综合精品| 成人夜晚看av| 国产免费a∨片在线观看不卡| 亚洲午夜激情网页| 91亚洲精品久久久蜜桃借种| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩在线观看免费高清| 日日噜噜噜噜人人爽亚洲精品| 国产一区二区三区在线观看精品| 欧美三级华人主播| h片在线观看下载| 91麻豆精品久久久久蜜臀| b站大片免费直播| 亚洲精品123区| 91视频九色网站| 中国日本在线视频中文字幕| 一本一道波多野结衣一区二区| 亚洲av人人澡人人爽人人夜夜| 国产精品99一区二区三| 国产精品久久久久高潮| 深夜福利在线看| 亚洲成人动漫av| 亚洲最大视频网| 欧美一区国产在线| 91精品视频网站| 麻豆最新免费在线视频| 欧美午夜精品久久久久久孕妇| 中文字幕一区二区三区人妻电影| 一区二区三区国产在线| 国产精品久久久久久久久久久久午夜片 | 亚洲精品一品区二品区三品区| 午夜av不卡| 亚洲精品wwwww| 国产手机在线视频| 99久久久久久| www.com毛片| 日韩aaa久久蜜桃av| 91精品国产91久久久久久久久| 丰满肉肉bbwwbbww| 亚洲一区二区三区激情| 极品白嫩的小少妇| 亚洲午夜电影| 国产在线视频欧美一区二区三区| h片在线观看视频免费| 日韩av资源在线播放| 丰满少妇乱子伦精品看片| 99re亚洲国产精品| 欧美三级午夜理伦三级| 欧美人与牛zoz0性行为| 国产精品直播网红| 国产在线观看av| 日韩欧美亚洲一区二区| 精品97人妻无码中文永久在线 | 一本一道久久a久久精品| 亚洲a v网站| 美女一区二区三区| 一级黄色录像免费看| 99re热精品视频| 91成人福利在线| 国产色在线 com| 欧美日韩国产经典色站一区二区三区| 日韩一卡二卡在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 久久久久久久久久久久久国产| 9999久久久久| 日韩暖暖在线视频| 黄色免费在线网站| 精品成人一区二区三区| 亚洲成人av影片| 中文字幕日韩一区| 黄色性视频网站| 久久精品综合| 精品一区二区三区毛片| 精品五月天堂| 国产精品永久免费观看| 成年网站在线视频网站| 亚洲品质视频自拍网| 一级全黄裸体免费视频| 亚洲国产乱码最新视频| 国产熟女一区二区| 国产成人在线免费| av动漫免费看| 女同性一区二区三区人了人一| 精品高清视频| 欧美日韩视频免费看| 97精品国产97久久久久久免费| 成人高清免费在线播放| 精品欧美一区二区久久| 国产男人搡女人免费视频| 亚洲国产日韩精品| 男人天堂资源网| jizz一区二区| www.五月天色| 乱码第一页成人| 国产成人永久免费视频| 色综合咪咪久久网| 欧美另类一区| 国产成人在线中文字幕| 国产噜噜噜噜噜久久久久久久久| 国内精彩免费自拍视频在线观看网址| 色偷偷偷综合中文字幕;dd| 日本黄色大片视频| 欧美一级专区免费大片| 中文字幕免费视频观看| 大桥未久av一区二区三区| 丰满少妇被猛烈进入一区二区| 日本一区二区视频在线| 波多野结衣影院| 国产福利一区在线| 999久久久精品视频| 日韩黄色一级片| 国产91xxx| 黄色亚洲大片免费在线观看| 国产免费色视频| 日韩国产欧美| 视频三区二区一区| 免费视频一区三区| 九九九九精品| 盗摄牛牛av影视一区二区| 91文字幕巨乱亚洲香蕉| 日韩午夜电影免费看| 国产精品欧美日韩久久| 写真福利精品福利在线观看| 欧美专区在线视频| 色是在线视频| 97精品国产91久久久久久| 波多野结衣精品| 欧美激情综合亚洲一二区| 中文在线手机av| 久热精品在线视频| gogo在线观看| 欧美成人在线免费视频| av毛片在线免费看| 欧美噜噜久久久xxx| 超碰在线网址| 欧美日韩国产成人| 国产福利在线免费观看| 久久久久久久久久久网站| 日本理论片午伦夜理片在线观看| 欧美精品免费看| 久操av在线| 1769国内精品视频在线播放| 国产精品蜜芽在线观看| 欧美亚洲激情在线| 日产精品一区| 国产精品香蕉国产| 99综合久久| 成人午夜电影免费在线观看| 国产精品白丝一区二区三区| 国产伦视频一区二区三区| 欧美日韩一区二区三区在线电影| 久久99热只有频精品91密拍| 亚洲精品进入| 亚洲人成人77777线观看| 国产韩国精品一区二区三区| 国产精品视频网站在线观看| 亚洲国产精品第一区二区| 日本中文字幕片| 久久精品999| 久久久久中文字幕亚洲精品| 成人免费毛片a| 一区二区黄色片| 国产精品久久久久久久久免费桃花 | 国产精品久久久久久久久毛片| 欧美一级理论片| 欧美 日韩 人妻 高清 中文| 亚洲美女av在线| 1024国产在线| 欧美激情a在线| 特黄毛片在线观看| 91精品国产综合久久久久久久久| 日韩欧美中文字幕在线视频| 久久久精彩视频| 日韩欧美综合| 国内精品在线观看视频| 秋霞影院一区二区| 日本黄色www| 久久精品在线观看| 欧美又粗又大又长| 日韩欧美精品在线观看| 国产日韩精品suv| 日韩精品极品视频免费观看| 黄视频网站在线看| 欧美亚洲日本网站| 欧美一区在线观看视频| 区一区二区三区中文字幕| 伊人色**天天综合婷婷| 无码精品国产一区二区三区免费| 国产一区二区不卡老阿姨| 蜜桃传媒一区二区亚洲av| 亚洲另类在线视频| 无码人妻丰满熟妇奶水区码| 日韩欧美一区在线| 成人高清在线| 欧美亚洲日本黄色| 99久久免费精品国产72精品九九| 蜜桃在线一区二区三区精品| 午夜欧美精品久久久久久久| 国内外成人免费在线视频| 99精品黄色片免费大全| 男人操女人的视频网站| 欧美日韩一级二级| 日韩av高清在线| 欧美激情视频一区二区| 四虎精品永久免费| 欧洲精品国产| 亚洲一区二区三区高清| 黄页网站在线看| 亚洲欧洲精品天堂一级| 亚洲午夜在线播放| 亚洲欧美激情一区| sis001亚洲原创区| 999视频在线免费观看| 国产精品久久久久久久| 国产一二三四在线视频| 久久一区二区三区四区| 九九在线观看视频| 欧美三级一区二区| 裸体xxxx视频在线| 欧美在线一级视频| 日韩av网站在线免费观看| 隔壁人妻偷人bd中字| 国产精品69久久久久水密桃 | 午夜在线成人av| 性做久久久久久久久久| 久热精品视频在线免费观看| 亚洲三级电影| 最近看过的日韩成人| 久久99精品国产.久久久久久| 亚洲高潮女人毛茸茸| 欧美亚洲综合在线| av影片免费在线观看| 国产精品亚洲欧美导航| 欧美国产一区二区三区激情无套| 手机看片一级片| 中文字幕制服丝袜一区二区三区| 一二三区在线播放| 精品激情国产视频| 国产视频一区二| 91网站在线观看免费| 粉嫩高潮美女一区二区三区| av资源吧首页| 亚洲国语精品自产拍在线观看| 国产在线看片免费视频在线观看| 国产伦精品一区二区三区高清版| 99在线精品免费视频九九视 | 色片在线免费观看| 国产精品久99| 99久久99久久久精品棕色圆| 欧美精品手机在线| 成人在线超碰| 日本一极黄色片| 国产精品视频一二三区| 国产一区二区三区四区视频| 精品中文字幕在线2019| 狠狠久久伊人| 99精品免费在线观看| 中文字幕精品一区二区精品绿巨人| 国产影视一区二区| 欧美精品电影在线| 亚洲精品3区| 岛国毛片在线播放| 亚洲综合偷拍欧美一区色| 亚洲 欧美 激情 小说 另类| 日韩免费在线播放| 影视亚洲一区二区三区| 人妻无码中文久久久久专区| 欧美色综合影院| 欧美极品少妇videossex| 快播日韩欧美| 久久66热偷产精品| 日韩精品一区二区不卡| 国产一区二区三区中文| 欧美日韩黄网站| 北条麻妃在线观看| 亚洲欧美一区二区三区久本道91| 免费看av毛片| 国产综合视频在线观看| 在线亚洲伦理| 亚洲最大的黄色网址| 日韩电视剧免费观看网站| 亚洲欧洲专区| 男人透女人免费视频| 一区二区成人在线视频| 岛国大片在线观看| 国产欧美日韩伦理|