日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

entity.Database.SqlQuery() 和entity.Database.SqlCommand()

發布時間:2025/6/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。