我使用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。
答案 0 :(得分:6)
您应该在案件中使用ExecuteNonQuery。
执行查询,并返回查询返回的结果集中第一行的第一列
的ExecuteNonQuery
对连接执行Transact-SQL语句并返回受影响的行数
您的查询不会返回任何内容,因此ExecuteScalar
不适合使用
如果您的查询已更新任何内容,则另一方的ExecuteNonQuery将提供正确的信息。
答案 1 :(得分:-1)
如果您将SQL语句修改为以下内容,我认为这将为您提供您期望的结果:
string sql = "
UPDATE StackOverflow SET UserName = @UserName
WHERE Id = @Id
RETURN @Id
";