ExecuteNonQuery不返回结果

这是我的(粗略)代码(DAL):

int i; // Some other declarations SqlCommand myCmdObject = new SqlCommand("some query"); conn.open(); i = myCmdObject.ExecuteNonQuery(); conn.close(); 

问题是:即使我的SELECT查询中存在记录, i的值仍为-1

可能是什么问题呢?

你执行什么样的查询? 使用ExecuteNonQuery用于UPDATEINSERTDELETE查询。 根据文件 :

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 当插入或更新的表上存在触发器时,返回值包括插入或更新操作所影响的行数以及受触发器或触发器影响的行数。 对于所有其他类型的语句,返回值为-1。

每当要执行不应返回值或记录集的SQL语句时,都应使用ExecuteNonQuery。

因此,如果要运行更新,删除或插入语句,则应使用ExecuteNonQuery。 ExecuteNonQuery返回受该语句影响的行数。 这听起来非常好,但是每当您使用SQL Server 2005 IDE或Visual Studio创建存储过程时,它都会添加一条废弃所有内容的小行。

该行是:SET NOCOUNT ON; 此行打开SQL Server的NOCOUNTfunction,“停止指示受Transact-SQL语句影响的行数的消息作为结果的一部分返回”,因此它使存储过程始终返回-1从应用程序调用(在我的例子中是一个Web应用程序)。

总之,从存储过程中删除该行,现在您将获得一个值,该值指示受该语句影响的行数。

编程愉快!

http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html

您将EXECUTENONQUERY()用于INSERTUPDATEDELETE

但是对于SELECT你必须使用EXECUTEREADER() ………

因为SET NOCOUNT选项设置为on。 删除“SET NOCOUNT ON”行 在您的查询或存储过程中。

有关详细信息,请参阅SqlCommand.ExecuteNonQuery()在执行Insert / Update / Delete时返回-1

你能发布确切的查询吗? ExecuteNonQuery方法返回@@ROWCOUNT Sql Server变量,在执行最后一个查询之后,它是ExecuteNonQuery方法返回的内容。

ExecuteNonQuery方法用于查询的SQL语句,例如INSERTUPDATE ,……如果希望语句返回结果(即查询),则需要使用ExecuteScalarExecuteReader

如果你想要的只是从查询中获得一个整数,请使用:

 myCmdObject.ExecuteScalar() 

如果要运行更新,删除或插入语句,则应使用ExecuteNonQuery。 ExecuteNonQuery返回受该语句影响的行数。

如何设置计数

从MSDN: SqlCommand.ExecuteNonQuery方法

您可以使用ExecuteNonQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,例如表),或者通过执行UPDATE,INSERT或DELETE语句来更改数据库中的数据而不使用DataSet。

虽然ExecuteNonQuery不返回任何行,但是映射到参数的任何输出参数或返回值都会填充数据。

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 当插入或更新的表上存在触发器时,返回值包括插入或更新操作所影响的行数以及受触发器或触发器影响的行数。 对于所有其他类型的语句,返回值为-1 。 如果发生回滚,则返回值也为-1。

您正在使用SELECT查询,因此您得到-1