[翻译] - <Entity Framework> - 直接执行数据库命令

简介: 原文:[翻译] - - 直接执行数据库命令纯属学习上的记录, 非专业翻译, 如有错误欢迎指正! 原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.
原文: [翻译] - <Entity Framework> - 直接执行数据库命令

纯属学习上的记录, 非专业翻译, 如有错误欢迎指正!

原文地址: 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 注入攻击. 恶意的用户可以直接在查询中注入命令执行操作, 删除数据库中的一个表, 拒绝提供服务或修改正在执行的操作的性质. 故你应该使用参数化的查询, 而不是直接将从外部获取的字符串插入到查询字符串中.

目录
相关文章
|
13天前
|
NoSQL 关系型数据库 MySQL
数据库常用命令汇总
数据库常用命令因数据库的类型(如关系型数据库、非关系型数据库等)和具体的产品(如MySQL、Oracle、SQL Server、MongoDB等)而异。
73 4
|
13天前
|
关系型数据库 MySQL 数据库
Python tk dos命令备份mysql数据库
Python tk dos命令备份mysql数据库
30 0
|
13天前
|
SQL 关系型数据库 MySQL
|
10天前
|
存储 缓存 NoSQL
NoSQL缓存数据库的使用场景实例和命令速查表
【5月更文挑战第8天】Redis 是一个内存数据结构服务,用 C 编写,支持五种数据结构,不仅限于键值对。它用于缓存、消息队列、订阅/发布系统等,提供持久化、主从复制和集群支持。了解其核心数据结构和应用场景是有效利用 Redis 的关键。
66 3
NoSQL缓存数据库的使用场景实例和命令速查表
|
13天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
13天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SPOOL命令:数据库世界的“录像机”
【4月更文挑战第19天】`SQL*Plus`的`SPOOL`命令是Oracle数据库中的“录像机”,能记录所有操作和输出。它在用户开始“SPOOL ON”时启动,记录SQL查询、输出、错误信息等。完成后,“SPOOL OFF”停止记录并生成日志文件,便于回顾和检查。日志文件可自定义保存位置和命名,支持多文件录制,方便分类管理。无论数据分析、SQL脚本编写还是日常维护,`SPOOL`都是强大的工具,值得一试!
|
13天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的HELP命令:你的数据库“百事通”
【4月更文挑战第19天】`Oracle SQL*Plus` 的 `HELP` 命令是数据库查询的强大工具,犹如“百事通”。在遇到困惑时,`HELP` 可提供详细命令解释和用法示例,解答基础到高级的 SQL 和 PL/SQL 疑问。它还是“活字典”,揭示命令关联与区别,如 `SET` 和 `ALTER SESSION`。此外,`HELP` 解释数据库概念,如“事务”,并支持模糊查询。无论新手还是专家,`HELP` 都是数据库探索的得力助手。
|
13天前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SET命令:你的数据库会话“调色板”
【4月更文挑战第19天】Oracle SQL*Plus的SET命令是数据库会话的“调色板”,用于设置输出格式、反馈信息和各种偏好。它能调整PAGESIZE和LINESIZE以优化显示,控制ECHO和FEEDBACK开关以定制反馈,以及统计命令执行时间(TIMING)和调试SQL(VERIFY)。更高级的选项如HEADING和COLSEP可改善输出的可读性。通过灵活运用SET命令,能提升工作效率和体验,是数据库管理员和开发者的必备工具。
|
13天前
|
SQL 数据库 HIVE
Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
【4月更文挑战第8天】Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
29 0
|
13天前
|
Shell Linux 数据库
【Shell 命令集合 网络通讯 】Linux 更新邮件别名数据库 newaliases命令 使用指南
【Shell 命令集合 网络通讯 】Linux 更新邮件别名数据库 newaliases命令 使用指南
31 1