ExecuteSqlCommand和SqlQuery有什么区别?什么时候进行数据库访问?

时间:2014-06-16 16:32:41

标签: c# asp.net entity-framework sql-server-2012 entity-framework-6

我有一些关于如何从我的数据库访问数据的建议:

var allMyIds
    = context.Database.ExecuteSqlCommand("select id from AspNetUserLogins");

var allMyIds
    = context.Database.SqlQuery<string>("select id from AspNetUserLogins");

有人可以解释这些之间的区别吗?

1 个答案:

答案 0 :(得分:39)

SqlQuery方法允许您从数据库中返回实体。其中ExecuteSqlCommand只运行命令并从DB返回状态代码。

More here

SqlQuery(强调我的)

  

创建一个原始SQL查询,该查询将返回给定类型的元素。类型可以是具有与查询返回的列的名称匹配的属性的任何类型,也可以是简单的基本类型。该类型不必是实体类型。即使返回的对象类型是实体类型,上下文也不会跟踪此查询的结果。 使用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));