ExecuteScalar返回的值不合适

本文关键字:不合适 返回 ExecuteScalar | 更新日期: 2024-09-25 23:56:05

我使用企业库,但我有一个问题:

string sql = " 
               UPDATE StackOverflow SET UserName = @UserName
               WHERE Id = @Id 
             ";
DbCommand cmd = base.Database.GetSqlStringCommand(sql);
base.Database.AddInParameter(cmd, "Id", DbType.Int32, StackOverflow.Id);
base.Database.AddInParameter(cmd, "UserName", DbType.Int32, StackOverflow.UserName);
int val = Convert.ToInt32(base.Database.ExecuteScalar(cmd));
Convert.ToInt32(base.Database.ExecuteScalar(cmd)) //returns 0.

我读过这篇文章http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

文章说:
如果插入新行,函数将返回新的"标识"列值,失败时返回0

但我没有插入到那个表中——我只想更新并返回更新后的行Id。

ExecuteScalar返回的值不合适

您应该在您的案例中使用ExecuteNonQuery。

ExecuteScalar

执行查询,并返回查询返回的结果集中第一行的第一列

执行非查询

对连接执行Transact-SQL语句,并返回受影响的行数

您的查询没有返回任何内容,因此ExecuteScalar不是正确的方法
如果您的查询更新了任何内容,则另一侧的ExecuteNonQuery将提供正确的信息。

如果您将SQL语句修改为以下内容,我认为这将给您带来您期望的结果:

string sql = " 
           UPDATE StackOverflow SET UserName = @UserName
           WHERE Id = @Id 
           RETURN @Id
         ";