为啥我计算行数的原始查询总是返回 -1?

Posted

技术标签:

【中文标题】为啥我计算行数的原始查询总是返回 -1?【英文标题】:Why does my raw query to count rows always returns -1?为什么我计算行数的原始查询总是返回 -1? 【发布时间】:2014-06-05 06:55:29 【问题描述】:

我正在尝试检查表是否存在,但无法正常工作。

由于某种原因,count 总是返回 -1。我已经在数据库中有一个表。它 应该返回 1?

SearchEntities db = new SearchEntities();

var qry3 = "";
var sql4 = "SELECT Count(*) FROM SearchDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'portland'";
var count = db.Database.ExecuteSqlCommand(sql4);

【问题讨论】:

我不熟悉 EF 但ExecuteSqlCommand 就像ExecuteNonQuery?也许它总是为SELECT 语句返回-1 计数显示为您的查询生成的结果集第一行的第一列。我不认为那是 ExecuteSqlCommand 返回的东西 - 你想要类似于 ExecuteScalar 的东西或一些实际上返回结果集给你的方法。 【参考方案1】:

ExecuteSqlCommand 不返回数据,它总是返回一个Int32,这是当它是一个DDL/DML 命令时,SQL 脚本处理的行数。

你想要SqlQuery<TElement>(String, Object[])

var count = db.Database.SqlQuery<int>(sql4).Single();

【讨论】:

【参考方案2】:

ExecuteStoreQuery 直接对数据源执行命令。

int result = entity.ExecuteStoreQuery<int>(@"
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName') 
    SELECT 1
ELSE
    SELECT 0
").SingleOrDefault();

查看答案here。

【讨论】:

ObjectContext 虽然仍然可用,但它是一个较旧的 API。现在推荐使用DbContext API。 ref 感谢@Stijin 提供参考。

以上是关于为啥我计算行数的原始查询总是返回 -1?的主要内容,如果未能解决你的问题,请参考以下文章

使用python计算文件中删除行数的最佳方法

计算一个非常大的表中确切行数的最快方法?

比 wc -l 更快、更精确地计算行数的方法

vim - 如何在不计算行数的情况下删除一大块文本?

SQL Server中关于基数估计如何计算预估行数的一些探讨

oracle 如何查询指定记录行数的记录