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

ExecuteSqlCommand 返回“无效的对象名称”错误

如何执行 EF Database.ExecuteSQLCommand 异步?

csharp ExecuteSqlCommand

如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?