这是我的(粗略)代码(DAL):
int i;
// Some other declarations
SqlCommand myCmdObject = new SqlCommand("some query");
conn.open();
i = myCmdObject.ExecuteNonQuery();
conn.close();
问题是:即使我的SELECT
查询中有记录,i
中的值仍为-1
。
可能是什么问题?
答案 0 :(得分:46)
您执行什么类型的查询?使用ExecuteNonQuery
适用于UPDATE
,INSERT
和DELETE
查询。根据{{3}}:
用于UPDATE,INSERT和DELETE 语句,返回值是 受影响的行数 命令。当a上存在触发器时 正在插入或更新的表, 返回值包括数量 受插入或插入影响的行 更新操作和数量 受触发器影响的行或 触发。对于所有其他类型的 语句,返回值为-1。
答案 1 :(得分:14)
每当您想要执行不应返回值或记录集的SQL语句时,应使用ExecuteNonQuery。
因此,如果要运行更新,删除或插入语句,则应使用ExecuteNonQuery。 ExecuteNonQuery返回受语句影响的行数。这听起来很不错,但是无论何时使用SQL Server 2005 IDE或Visual Studio创建存储过程,它都会添加一条破坏所有内容的小行。
该行是:SET NOCOUNT ON;此行打开SQL Server的NOCOUNT功能,其中"停止指示受Transact-SQL语句影响的行数的消息作为结果的一部分返回"因此,当从应用程序调用时(在我的情况下是Web应用程序),它使存储过程始终返回-1。
总之,从存储过程中删除该行,现在您将获得一个值,该值指示受该语句影响的行数。
快乐的节目!
答案 2 :(得分:7)
您对EXECUTENONQUERY()
,INSERT
和UPDATE
使用DELETE
。
但对于SELECT
,您必须使用EXECUTEREADER()
.........
答案 3 :(得分:6)
因为SET NOCOUNT选项设置为on。删除“SET NOCOUNT ON”行在您的查询或存储过程中。
在 SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete 了解详情。
答案 4 :(得分:1)
你能发布确切的查询吗? ExecuteNonQuery
方法返回@@ROWCOUNT
Sql Server变量,在最后一个查询执行之后,它就是ExecuteNonQuery
方法返回的内容。
答案 5 :(得分:1)
如果你想要的只是从查询中获得一个整数,请使用:
myCmdObject.ExecuteScalar()
答案 6 :(得分:1)
ExecuteNonQuery
方法用于非查询的SQL语句,例如INSERT
,UPDATE
,...您想要使用{{ 1}}或ExecuteScalar
如果您希望您的语句返回结果(即查询)。
答案 7 :(得分:0)
来自MSDN:SqlCommand.ExecuteNonQuery Method
您可以使用ExecuteNonQuery 执行目录操作(for 例如,查询a的结构 数据库或创建数据库对象 如表),或改变数据 在不使用DataSet的数据库中 通过执行UPDATE,INSERT或DELETE 语句。
虽然ExecuteNonQuery返回 没有行,任何输出参数或 映射到参数的返回值是 填充数据。
用于UPDATE,INSERT和DELETE 语句,返回值是 受影响的行数 命令。当a上存在触发器时 正在插入或更新的表, 返回值包括数量 受插入或插入影响的行 更新操作和数量 受触发器影响的行或 触发。 适用于所有其他类型的 语句,返回值为-1 。如果 发生回滚,返回值为 也-1。
您正在使用SELECT查询,因此您获得-1
答案 8 :(得分:0)
如果你想运行更新,删除, 或者插入语句,你应该使用 ExecuteNonQuery。的ExecuteNonQuery 返回受影响的行数 声明。