精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美另类久久久品| 国产亚洲欧美日韩俺去了| 欧美激情一区二区久久久| 久久精品女同亚洲女同13| 日韩伦理精品| 中文字幕一区二区三区精华液| 亚洲jizzjizz日本少妇| 日韩xxx高潮hd| 日韩理论电影院| 精品国产免费一区二区三区香蕉| 欧美亚洲另类色图| 女女色综合影院| 国产伦精品一区二区三区免费 | 国产日韩欧美中文在线播放| 老女人性淫交视频| 国产亚洲一区二区三区不卡| 欧美一区二区三区男人的天堂| 日韩在线一级片| 老司机在线看片网av| 99re热这里只有精品免费视频| 国产精品久久久久久久久| 国产在线观看免费av| 成人精品天堂一区二区三区| 亚洲精品在线网站| 亚洲精品综合在线观看| 中文在线免费视频| 一区二区三区.www| 亚洲一区美女| 欧美色视频免费| 丁香婷婷综合激情五月色| 国产裸体写真av一区二区| 国产成人精品一区二三区| 久久久久国产精品| 在线视频欧美日韩精品| 魔女鞋交玉足榨精调教| 999久久久久久久久6666| 欧美色精品在线视频| 国产亚洲天堂网| 黄色污污视频在线观看| 亚洲欧美激情在线| 亚洲午夜精品一区二区三区| 久久久久久女乱国产| 国产91精品一区二区麻豆网站| 成人免费看吃奶视频网站| 无码aⅴ精品一区二区三区| 激情亚洲成人| 欧美激情中文字幕乱码免费| 日本黄色片免费观看| 日韩国产一区二区| 国产一区二区三区18| 精品夜夜澡人妻无码av| 久久99精品国产自在现线| 日韩一区二区免费在线观看| 欧美成人乱码一二三四区免费| 偷拍中文亚洲欧美动漫| 色综合久久天天| 欧美成人精品欧美一级乱| 偷拍自拍在线看| 婷婷六月综合网| 91专区在线观看| 中文av在线全新| 色88888久久久久久影院野外 | 麻豆国产欧美日韩综合精品二区 | 99热这里有精品| 欧美日韩国产在线观看| 天天干天天av| 亚洲一区二区av| 欧美一区三区二区| 中文字幕一二三区| 国产成人在线中文字幕| 亚洲精品短视频| 91久久免费视频| 成人久久综合| 久久久精品国产一区二区| 国产一区二区视频在线观看免费| 国产精品久久久久久久| 久久五月情影视| 毛片aaaaa| 一区二区三区国产盗摄| 国产97在线观看| 一区二区三区午夜| 懂色av一区二区夜夜嗨| 久久久久久久久久久久久久一区| 国产小视频在线播放| 国产精品久久综合| 成人午夜视频免费观看| 天堂√中文最新版在线| 欧美日韩精品综合在线| 91亚洲一区二区| 欧美电影完整版在线观看| 亚洲美女久久久| 日韩激情小视频| 狠狠综合久久av一区二区老牛| 97国产成人精品视频| 成年人视频免费| 国产另类ts人妖一区二区| 国产一区免费在线| 中文字幕在线免费| 亚洲福中文字幕伊人影院| 乱子伦视频在线看| 亚洲欧洲国产精品一区| 亚洲欧美综合v| 成人免费精品动漫网站| 国产亚洲在线| 亚洲最大成人网色| 免费在线稳定资源站| 亚洲欧美在线高清| 日韩免费毛片视频| 久久综合给合| 在线日韩中文字幕| 日本亚洲色大成网站www久久| 美女视频免费一区| 精品无人乱码一区二区三区的优势 | 图片区小说区区亚洲五月| 欧美6一10sex性hd| 欧美精品成人一区二区三区四区| 手机在线成人av| 中文字幕免费一区二区| 国产第一区电影| 亚洲精品网站在线| 国产精品传媒入口麻豆| 欧洲av无码放荡人妇网站| 麻豆一二三区精品蜜桃| 一区二区福利视频| 亚洲男人的天堂在线视频| 极品美女销魂一区二区三区 | 内射无码专区久久亚洲| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 久久久久久久久久久97| 奇米一区二区三区av| 精品无人区一区二区三区| 在线欧美三级| 欧美丰满少妇xxxxx高潮对白| 久久久久久九九九九九| 国产日韩欧美一区| 高清一区二区三区视频| jizz性欧美| 欧美日韩精品欧美日韩精品一综合| 黄色在线观看av| 亚洲精选91| 国内一区在线| av电影免费在线看| 精品日韩一区二区三区| 小嫩苞一区二区三区| 六月婷婷色综合| 午夜精品一区二区在线观看 | 成人精品一区二区三区| 成人亚洲综合天堂| 欧美亚洲精品一区| 日本人亚洲人jjzzjjz| 老司机精品视频网站| 日本精品一区二区三区高清 久久| 两个人看的在线视频www| 亚洲国产精品人久久电影| 久久久久99精品| 成人激情综合网站| 日本一道本久久| 香蕉人人精品| 国产z一区二区三区| 黄色在线观看网| 日本丰满少妇一区二区三区| 亚洲国产av一区| 日本不卡高清视频| 在线观看福利一区| 麻豆一二三区精品蜜桃| 欧美激情精品久久久久久变态| 亚洲欧美激情在线观看| 午夜影视日本亚洲欧洲精品| 亚洲av无码一区二区三区观看 | 国产精品久久久久aaaa| 久国产精品视频| 欧美片第1页综合| 精品高清视频| 亚洲伦乱视频| 色哟哟入口国产精品| 999精品国产| 亚洲成va人在线观看| 欧美图片一区二区| 久久狠狠亚洲综合| 欧美中文字幕在线观看视频| 日韩欧美国产大片| 国产精品电影观看| 在线āv视频| 精品亚洲国产成av人片传媒| 中文无码精品一区二区三区| 一区二区久久久| 泷泽萝拉在线播放| 国产一二三精品| 国产美女网站在线观看| 日韩久久精品| 国产免费一区二区| 男女啪啪999亚洲精品| 欧美极品xxxx| 国产黄在线观看| 精品捆绑美女sm三区| 岛国av中文字幕| 亚洲精品伦理在线| 能免费看av的网站| 丁香激情综合五月| 成人免费在线观看视频网站| 羞羞答答成人影院www| 久久久久久久久四区三区| 国产精品高清一区二区| 91av在线国产| av片哪里在线观看| 亚洲丝袜在线视频| 国产成人自拍一区| 欧美精品免费视频| 天天干在线播放| 一区二区理论电影在线观看| 超碰人人干人人| aa级大片欧美| 午夜诱惑痒痒网| 久久久久久黄| 免费拍拍拍网站| 亚洲二区三区不卡| 日韩在线第一区| 日韩精品亚洲aⅴ在线影院| 亚洲xxx视频| 97久久网站| 欧美在线免费观看| av午夜在线观看| 欧美日韩999| 视频免费一区| 亚洲一区二区黄| 深夜福利视频在线免费观看| 欧美成人性福生活免费看| 中文字幕在线观看高清| 一本久道久久综合中文字幕| 国产精品成人网站| 亚洲女爱视频在线| 少妇aaaaa| 国产精品国产馆在线真实露脸| 亚洲a v网站| 91啪亚洲精品| 朝桐光av一区二区三区| 国产99久久久精品| 欧美性猛交xx| 国产成人综合网| 成人日韩在线视频| 麻豆国产一区二区| 911福利视频| 国产在线观看免费一区| www.cao超碰| 激情综合色播激情啊| 亚洲一区日韩精品| 免费人成黄页网站在线一区二区| 黄色片一级视频| 久久一综合视频| 一本久道中文无码字幕av| 久久精品国语| 污污的网站18| 日本v片在线高清不卡在线观看| 免费黄色一级网站| 蜜臀av性久久久久蜜臀aⅴ| 国产视频一区二区三区在线播放| 日韩电影一二三区| 亚洲一级免费观看| 韩国av一区二区三区| 亚洲av无码久久精品色欲| 国产成人一级电影| chinese麻豆新拍video| 久久久欧美精品sm网站| 国产破处视频在线观看| 中文字幕在线视频一区| 日韩成人毛片视频| 亚洲国产日日夜夜| 久久青青草原亚洲av无码麻豆| 一本一道波多野结衣一区二区| 樱花视频在线免费观看| 欧美精品视频www在线观看| 亚洲经典一区二区三区| 日韩电影在线观看中文字幕| 国产在线视频福利| 久久视频在线直播| 岛国av在线网站| 国产成人中文字幕| 日本超碰一区二区| 精品免费日产一区一区三区免费| 国语产色综合| 大地资源第二页在线观看高清版| 国产综合自拍| 激情综合网婷婷| 激情成人综合网| 国产麻豆xxxvideo实拍| 国产欧美一区视频| 免费在线观看国产精品| 欧美性猛交xxxx| 国产一区二区在线视频聊天| 精品国产凹凸成av人网站| 国产视频第一页在线观看| 理论片在线不卡免费观看| av第一福利在线导航| 国产欧美日韩精品丝袜高跟鞋| jizz国产精品| 亚洲福利av| 亚洲激情精品| 在线黄色免费看| 久久综合九色综合97_久久久| 精品国产视频在线观看| 岛国精品视频在线播放| 99精品视频免费看| 亚洲视频在线观看视频| 成人av影院在线观看| 国产精品尤物福利片在线观看| 电影一区二区在线观看| 亚洲精品国产精品国自产观看| 激情欧美日韩一区| www.色欧美| 国产性做久久久久久| 久久久久久欧美精品se一二三四| 欧美性猛交xxxxxxxx| 天堂在线资源网| 美女福利视频一区| 精品三级在线| 人偷久久久久久久偷女厕| 亚洲一级黄色| 色偷偷中文字幕| 国产精品久久久久久亚洲伦| 国内免费精品视频| 日韩精品一区二区三区视频播放 | 久久成人精品视频| 国模视频一区| 欧美福利精品| aa国产精品| 污污污www精品国产网站| 亚洲人123区| 伊人精品一区二区三区| 国产一区二区日韩| xxxxxx欧美| 精品久久精品久久| 伊人激情综合| www.555国产精品免费| 综合av第一页| 一区二区三区www污污污网站| 亚洲日韩中文字幕| 成人免费影院| 久久偷窥视频| 国产日本精品| 国产色视频一区二区三区qq号| 精品成人av一区| 熟妇人妻av无码一区二区三区| 欧美精品久久一区二区| 亚洲1区在线| 国产aaa免费视频| 国产成人精品一区二区三区网站观看| 顶臀精品视频www| 欧美一区二区日韩一区二区| 黄色精品免费看| 99在线视频免费观看| 欧美日韩18| 午夜男人的天堂| 精品久久久久久久大神国产| 色哟哟在线观看| 国产成人自拍视频在线观看| 日韩电影一区| 黄色a级三级三级三级| 亚洲精品免费在线观看| 国产精品久久久久精| 欧美成人午夜影院| 中文字幕一区二区三区四区久久 | 日韩av片在线免费观看| 欧美日韩一区二区三区免费看 | 福利在线一区二区三区| 国产精品女上位| 国产免费无遮挡| 国内精品400部情侣激情| 亚洲肉体裸体xxxx137| www.xxx亚洲| 日韩毛片精品高清免费| 亚洲精品久久久狠狠狠爱| 51午夜精品视频| 精品香蕉视频| 最新av免费在线观看| 亚洲永久免费视频| 天堂成人在线观看| 国产精品普通话| 欧美视频日韩| 永久免费看mv网站入口78| 欧美另类z0zxhd电影| h片在线观看| 丝袜美腿玉足3d专区一区| 国产尤物一区二区| 日韩美女一级片| 亚洲一级黄色片| 高清日韩中文字幕| 美女少妇一区二区| 亚洲一区二区三区三| 高清中文字幕一区二区三区| 亚洲伊人久久综合| 久久性天堂网| 精品97人妻无码中文永久在线 | 日本蜜桃在线观看| 久久精品国产一区二区三区日韩| 看国产成人h片视频| 国产精品suv一区二区69| 中文字幕欧美精品在线| 红杏一区二区三区| 99精品视频国产| 色偷偷成人一区二区三区91|