ExecuteSqlCommand 与 SqlQuery 有啥区别?进行数据库访问时?
Posted
技术标签:
【中文标题】ExecuteSqlCommand 与 SqlQuery 有啥区别?进行数据库访问时?【英文标题】:What is the difference between ExecuteSqlCommand vs SqlQuery ? when doing a db access?ExecuteSqlCommand 与 SqlQuery 有什么区别?进行数据库访问时? 【发布时间】:2014-08-06 13:12:54 【问题描述】:关于如何访问我的数据库中的数据,我有几个建议:
var allMyIds
= context.Database.ExecuteSqlCommand("select id from AspNetUserLogins");
var allMyIds
= context.Database.SqlQuery<string>("select id from AspNetUserLogins");
如果有的话,谁能解释一下这些之间的区别?
【问题讨论】:
将鼠标悬停在var
关键字上。那应该会给你答案。
【参考方案1】:
SqlQuery
方法允许您从数据库中返回实体。而ExecuteSqlCommand
只是运行命令并从数据库返回状态码。
More here
SqlQuery
(强调我的)
创建一个原始 SQL 查询,该查询将返回给定 type 的元素。该类型可以是具有与查询返回的列的名称相匹配的属性的任何类型,也可以是简单的原始类型。该类型不必是实体类型。即使返回的对象类型是实体类型,上下文也不会跟踪此查询的结果。 使用 SqlQuery 方法返回由上下文跟踪的实体。 与任何接受 SQL 的 API 一样,参数化任何用户输入以防止 SQL 注入攻击非常重要。您可以在 SQL 查询字符串中包含参数占位符,然后提供参数值作为附加参数。您提供的任何参数值都将自动转换为 DbParameter。 context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @p0", userSuppliedAuthor);或者,您也可以构造一个 DbParameter 并将其提供给 SqlQuery。这允许您在 SQL 查询字符串中使用命名参数。 context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
ExecuteSqlCommand
返回类型:int
对数据库执行给定的 DDL/DML 命令。与任何接受 SQL 的 API 一样,重要的是参数化任何用户输入以防止 SQL 注入攻击。您可以在 SQL 查询字符串中包含参数占位符,然后提供参数值作为附加参数。您提供的任何参数值都将自动转换为 DbParameter。 context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @p0", userSuppliedAuthor);或者,您也可以构造一个 DbParameter 并将其提供给 SqlQuery。这允许您在 SQL 查询字符串中使用命名参数。 context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));
【讨论】:
所以你说有人为我建议的第一个命令不起作用。对吗? 否,但这取决于您的实施。您可以让它返回不在您的简单示例中的数据。 See here for an answer to that question以上是关于ExecuteSqlCommand 与 SqlQuery 有啥区别?进行数据库访问时?的主要内容,如果未能解决你的问题,请参考以下文章
使用 EF 的 DbContext.ExecuteSqlCommand() 的事务期间出现异常
ExecuteSqlCommand 返回“无效的对象名称”错误