0

我使用 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

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

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

4

2 回答 2

6

您应该在您的情况下使用ExecuteNonQuery

执行标量

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

执行非查询

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

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

于 2012-08-04T10:11:51.477 回答
-1

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

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

           RETURN @Id
         ";
于 2012-08-04T10:11:52.797 回答