ExecuteScalar返回值不合适

时间:2012-08-04 10:04:39

标签: c# enterprise-library

我使用Enterprise Library,我遇到一个问题:

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

文章说:
如果插入了新行,则该函数返回新的Identity列值,失败时返回0。

但我没有插入该表 - 我只想更新并返回更新的行ID。

2 个答案:

答案 0 :(得分:6)

您应该在案件中使用ExecuteNonQuery

ExecuteScalar

  

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

的ExecuteNonQuery

  

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

您的查询不会返回任何内容,因此ExecuteScalar不适合使用 如果您的查询已更新任何内容,则另一方的ExecuteNonQuery将提供正确的信息。

答案 1 :(得分:-1)

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

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

           RETURN @Id
         ";