ExecuteScalar和ExecuteNonQuery
如果想返回像Count(*)、Sum(Price)或Avg(Quantity)的结果那样的单值,可以使用 Command.ExecuteScalar。ExecuteScalar返回第一行第一列的值,将结果集作为标量值返回。因为单独一步就能完成,所以 ExecuteScalar不仅简化了代码,还提高了性能;要是使用DataReader就需要两步才能完成(即,ExecuteReader+取值)。
使用不返回行的SQL语句时,例如修改数据(例如INSERT、UPDATE或DELETE)或仅返回输出参数或返回值,请使用ExecuteNonQuery。这避免了用于创建空DataReader的任何不必要处理。
测试Null
如果表(在数据库中)中的列允许为空,就不能测试参数值是否“等于”空。相反,需要写一个WHERE子句,测试列和参数是否都为空。下面的 SQL语句返回一些行,它们的LastName列等于赋给@LastName参数的值,或者LastName列和@LastName参数都为空。
SELECT * FROM Customers
WHERE ((LastName = @LastName) OR (LastName IS NULL AND @LastName IS NULL))
SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数。
对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1
所以在查询表中是否有(某条)数据的时候,一定不能用select sql语句+ cmd.ExecuteNonQuery(),通过判断返回值是否大于0来判断。
解决方案:
1.
SqlCeCommand.ExecuteScalar 方法 ( + 聚合查询)
执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 例如一个聚合值。
cmd.CommandText = "select count(*) from users where id = 10000;"
int count = (int)cmd.ExecuteScalar() ;
2. 用ExcuteReader()方法返回一个reader
if(reader.Read() == false) { ...}