cmd.ExecuteScalar()返回0

问题描述:

我想获得一个表的行数。cmd.ExecuteScalar()返回0

cmd.CommandText = "SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM EMPLOYEE))"; 
Records = int.Parse(cmd.ExecuteScalar().ToString()); 

即使在员工表1行,记录总是有值为0 为什么的ExecuteScalar()返回0?

+16

为什么所有的嵌套FROM子句?如果您只是使用“SELECT COUNT(*)FROM EMPLOYEE”,会发生什么情况? – 2012-02-01 09:42:23

你正在尝试计算是行EMPLOYEE表的数量,因此Pranav和维诺德是正确的。但是,假设你尽量简化你的情况只是直接指向您的问题,我会说,你需要给名字的临时表是这样的:

cmd.CommandText = "SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM EMPLOYEE) as T1) as T2"; 
Records = int.Parse(cmd.ExecuteScalar().ToString()); 

这应该做的伎俩。

另外一个建议是不要用count(0);改用count(0)。 '*'带来视图中的所有数据;这是计数函数不必要的性能下降。

试试这个:

cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEE"; 
int Records = (int)cmd.ExecuteScalar(); 

应该返回EMPLOYEE表的行数。

要仔细检查,请使用SQL管理工作室对SQL服务器执行相同的代码并查看结果是什么。您的应用程序是否可能配置为将您正在查看的数据库指向另一个数据库?

只是说:

cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEE"; 
Records = int.Parse(cmd.ExecuteScalar().ToString()); 

试试这个:

cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEE" 
Int record=(Int32)cmd.Executescalar(); 

它返回0,因为你的SQL请求无效。

您应该总是在将代码写入代码之前,直接对数据库尝试您的请求(例如,如果您使用的是SQL Server,则使用SQL Server Management Studio)。你会看到它不会返回任何东西,因为它有语法错误。

如果你想使用嵌套SELECT * FROM为你写的,这里的有效的SQL请求,将返回你所期望的:

SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM EMPLOYEE) AS Foo1) AS Foo2 

在任何情况下,其他所有的答案都指出,这并没有使很有意义,必须替换为:

SELECT COUNT(*) FROM EMPLOYEE