这是我的(粗略)代码(DAL):
int i; // Some other declarations SqlCommand myCmdObject = new SqlCommand("some query"); conn.open(); i = myCmdObject.ExecuteNonQuery(); conn.close();
问题是:即使SELECT查询中存在一条记录,i中的值仍为-1。有什么问题吗?
SELECT
i
-1
uklbhaso1#
您要执行哪种查询?使用ExecuteNonQuery是为了UPDATE、INSERT和DELETE查询。根据the documentation:对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。当触发器存在于要插入或更新的表中时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。
ExecuteNonQuery
UPDATE
INSERT
DELETE
hpcdzsge2#
每当您要执行不应返回值或记录集的SQL语句时,都应使用ExecuteNonQuery。因此,如果您要运行更新、删除或插入语句,则应使用ExecuteNonQuery。ExecuteNonQuery返回受语句影响的行数。这听起来很不错,但每当您使用SQL Server 2005 IDE或Visual Studio创建存储过程时,它都会添加一行小字,从而破坏一切。那行字是:设置NOCOUNT ON;这一行打开了SQL Server的NOCOUNT功能,该功能“阻止将指示受Transact-SQL语句影响的行数的消息作为结果的一部分返回”,因此它使存储过程在从应用程序(在我的示例中是Web应用程序)调用时总是返回-1。最后,从存储过程中删除该行,您现在将获得一个值,该值指示受语句影响的行数。快乐编程!http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html
vjrehmav3#
您可以将EXECUTENONQUERY()用于INSERT、UPDATE和DELETE。但是对于SELECT,您必须使用EXECUTEREADER() .........
EXECUTENONQUERY()
EXECUTEREADER()
idv4meu84#
因为SET NOCOUNT选项设置为ON.删除行“SET NOCOUNT ON;“的名称。如欲了解更多信息,请访问 * SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete *。
7z5jn7bk5#
ExecuteNonQuery方法返回的是@@ROWCOUNT SQL Server变量,而ExecuteNonQuery方法返回的是最后一个查询执行后的结果。
@@ROWCOUNT
yuvru6vn6#
ExecuteNonQuery方法用于不是查询的SQL语句,例如INSERT、UPDATE ......如果希望语句返回结果(即查询),则需要使用ExecuteScalar或ExecuteReader。
ExecuteScalar
ExecuteReader
lsmepo6l7#
来自MSDN:SqlCommand.ExecuteNonQuery Method您可以使用ExecuteNonQuery来执行目录作业(例如,查询数据库的结构或建立数据库对象(例如数据表)),或借由执行UPDATE、INSERT或DELETE陈述式,在不使用DataSet的情况下变更数据库中的数据。虽然ExecuteNonQuery不会传回任何数据列,但Map至参数的任何输出参数或传回值都会填入数据。对于UPDATE、INSERT和DELETE语句,返回值是受该命令影响的行数。当触发器存在于要插入或更新的表上时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。您使用的是SELECT查询,因此得到-1
lc8prwob8#
如果只想从查询中获取单个整数,请用途:
myCmdObject.ExecuteScalar()
omjgkv6w9#
如果你想运行一个更新、删除或插入语句,你应该使用ExecuteNonQuery。2 ExecuteNonQuery返回受语句影响的行数。How to Set Count On
9条答案
按热度按时间uklbhaso1#
您要执行哪种查询?使用
ExecuteNonQuery
是为了UPDATE
、INSERT
和DELETE
查询。根据the documentation:对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。当触发器存在于要插入或更新的表中时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。
hpcdzsge2#
每当您要执行不应返回值或记录集的SQL语句时,都应使用ExecuteNonQuery。
因此,如果您要运行更新、删除或插入语句,则应使用ExecuteNonQuery。ExecuteNonQuery返回受语句影响的行数。这听起来很不错,但每当您使用SQL Server 2005 IDE或Visual Studio创建存储过程时,它都会添加一行小字,从而破坏一切。
那行字是:设置NOCOUNT ON;这一行打开了SQL Server的NOCOUNT功能,该功能“阻止将指示受Transact-SQL语句影响的行数的消息作为结果的一部分返回”,因此它使存储过程在从应用程序(在我的示例中是Web应用程序)调用时总是返回-1。
最后,从存储过程中删除该行,您现在将获得一个值,该值指示受语句影响的行数。
快乐编程!
http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html
vjrehmav3#
您可以将
EXECUTENONQUERY()
用于INSERT
、UPDATE
和DELETE
。但是对于
SELECT
,您必须使用EXECUTEREADER()
.........idv4meu84#
因为SET NOCOUNT选项设置为ON.删除行“SET NOCOUNT ON;“的名称。
如欲了解更多信息,请访问 * SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete *。
7z5jn7bk5#
ExecuteNonQuery
方法返回的是@@ROWCOUNT
SQL Server变量,而ExecuteNonQuery
方法返回的是最后一个查询执行后的结果。yuvru6vn6#
ExecuteNonQuery
方法用于不是查询的SQL语句,例如INSERT
、UPDATE
......如果希望语句返回结果(即查询),则需要使用ExecuteScalar
或ExecuteReader
。lsmepo6l7#
来自MSDN:SqlCommand.ExecuteNonQuery Method
您可以使用ExecuteNonQuery来执行目录作业(例如,查询数据库的结构或建立数据库对象(例如数据表)),或借由执行UPDATE、INSERT或DELETE陈述式,在不使用DataSet的情况下变更数据库中的数据。
虽然ExecuteNonQuery不会传回任何数据列,但Map至参数的任何输出参数或传回值都会填入数据。
对于UPDATE、INSERT和DELETE语句,返回值是受该命令影响的行数。当触发器存在于要插入或更新的表上时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。
您使用的是SELECT查询,因此得到-1
lc8prwob8#
如果只想从查询中获取单个整数,请用途:
omjgkv6w9#
如果你想运行一个更新、删除或插入语句,你应该使用ExecuteNonQuery。2 ExecuteNonQuery返回受语句影响的行数。
How to Set Count On