entity.Database.SqlQuery() 和entity.Database.SqlCommand()
原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103)
使用 EF 4.1 或者更新版本, 你可以直接執行任何數據庫命令. 在本節介紹的方法允許你對數據庫執行原生的 SQL 命令.
?
通過 SQL 查詢語句獲取實體對象集
DbSet 類中的 SqlQuery 方法允許你執行一個返回實體對象集的原生 SQL 查詢. 默認情況下, 返回的對象集會被上下文跟蹤; 這可以通過對方法返回的 DbSqlQuery 對象調用 AsNoTracking 方法取消.返回的結果集一般為 DbSet 所對應的類型, 否則即便是其派生類也無法返回. 如果所查詢的表包含了其他實體類型的數據, 那么所執行的 SQL 語句應該被正確書寫, 保證只返回指定類型實體的數據. 下面的例子使用 SqlQuery 方法執行了一個 SQL 查詢, 返回一個 Department 類型的實例集.
1 using (var context = new SchoolEntities()) 2 { 3 var departments = context.Departments.SqlQuery( 4 "select * from Department").ToList(); 5 }譯注: AsNoTracking 方法必須再查詢執行前調用, 查詢執行后調用無效.
通過 SQL 查詢獲取非實體對象集
通過 Database 類中的 SqlQuery 方法來執行原生 SQL 命令, 可以返回任何類型的實例, 包括 .Net 中的原生類型. 但獲取的數據將不會被上下文對象跟蹤, 即使我們用這個方法來檢索實體對象. 如:
1 using (var context = new SchoolEntities()) 2 { 3 var names = context.Database.SqlQuery<string>("select Name from Department").ToList(); 4 }讓數據庫執行原生的非查詢 SQL 命令
可以通過 Database 類中的 ExecuteSqlCommand 方法執行非查詢命令. 例如:
1 using (var context = new SchoolEntities()) 2 { 3 context.Database.ExecuteSqlCommand("update Department set Name = 'Mathematics' where Name = 'Math'"); 4 }ExecuteSqlCommand 方法有時會被用在 Code First 創建的數據庫的初始化函數中, 用來對數據庫進行一些額外的配置 (例如, 設置索引). 需要注意的是, 上下文對象并不知道執行了 ExecuteSqlCommand 方法后數據庫中的數據有什么改變, 除非你從數據庫中載入或重新載入實體集.
調用存儲過程
Code First 并不支持對存儲過程的映射. 但是, 你可以通過 ExecuteSqlCommand 或 SqlQuery 方法直接調用存儲過程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").
譯注: 本文提到的三個方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持參數化查詢, 用法和 string.Format 類似, 但是在查詢執行時會對傳入的參數進行類型轉換. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 該語句執行時, 會將字符串 "6" 轉化為整數然后再代入查詢語句中執行, 可以有效防止 SQL 注入.
防止 SQL 注入攻擊
應用程序經常要從外部獲取輸入 (來自用戶和其他外部代理) , 然后根據這些輸入執行相關操作. 從用戶或外部代理直接或間接獲取的任何信息都可能利用目標程序語言的語法來執行違法操作. 當目標語言是結構化查詢語言 (SQL) 時, 例如 Transact-SQL, 這個操作被稱為 SQL 注入攻擊. 惡意的用戶可以直接在查詢中注入命令執行操作, 刪除數據庫中的一個表, 拒絕提供服務或修改正在執行的操作的性質. 故你應該使用參數化的查詢, 而不是直接將從外部獲取的字符串插入到查詢字符串中.
轉載于:https://www.cnblogs.com/powerzhang/p/3640111.html
總結
以上是生活随笔為你收集整理的entity.Database.SqlQuery() 和entity.Database.SqlCommand()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “是福不是祸,是祸躲不过”这句话对吗?
- 下一篇: 分科目统计每科前三名的学生