2

我在 asp.net 中有以下 SQL 命令:

cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO userscore (username, score)VALUES(@username,   @score)";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
cmd.ExecuteNonQuery();

此命令有效,但每次单击按钮时它都会在 my sql 数据库中存储两个值。它从文本框中获取分数值,但是当数据库中已经存在用户名 + 分数时,我想更新该值。有人可以帮我查询以完成此操作吗?

为了澄清我的问题:我想存储新分数,即使它低于当前分数,并且用户名在表中是唯一的。

4

4 回答 4

3

我假设您只想为每个用户名存储一个高分,而不是只存储一个全局高分。

DECLARE @highscore int NULL
SELECT @highscore = MAX(score) FROM userscore WHERE username = @username

IF @highscore IS NULL BEGIN

    INSERT INTO userscore ( username, score ) VALUES ( @username, @score )

END ELSE IF @score > @highscore BEGIN

    UPDATE userscore SET score = @score WHERE username = @username

END

此 T-SQL 脚本需要两个参数,@username@score. 变量在@highscore脚本中声明。

于 2013-03-15T19:47:33.533 回答
2

如果 SQL 2008 或更高版本:

MERGE INTO userscore as target
  USING(VALUES(@username, @score)) AS source(UserName, Score)
  ON (target.UserName = source.UserName)
  WHEN MATCHED THEN
    UPDATE SET Score = source.Score)
  WHEN NOT MATCHED THEN
    INSERT(UserName, Score) VALUES(source.UserName, source.Score)
;

如果匹配的MERGE记录存在,则语句执行更新,否则执行插入。这也是一个语句,因此您不必先检查记录是否存在。

复制/粘贴版本是:

cmd.CommandText = "MERGE INTO userscore as target USING(VALUES(@username, @score)) AS Source(UserName, Score) ON (target.UserName = source.UserName) WHEN MATCHED THEN UPDATE SET Score = source.Score) WHEN NOT MATCHED THEN INSERT(UserName, Score) VALUES(source.UserName, source.Score);";
于 2013-03-15T19:52:16.297 回答
2

您可以使用存储过程,如果没有分数则插入分数,如果分数低于新分数,则更新用户分数

代码

cmd = connection.CreateCommand();
cmd.CommandText = "update_highscore";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
cmd.ExecuteNonQuery();

执行此操作以创建存储过程

CREATE PROCEDURE update_highscore
@username VARCHAR(30),
@userscore INT
AS
UPDATE userscore 
SET score = @score
WHERE username = @username

IF @@ROWCOUNT = 0
    INSERT userscore (username, score) VALUES (@username, @score)
于 2013-03-15T20:19:08.723 回答
1

如果用户名对于表来说应该是唯一的,那么您可以使用更新查询加上 SqlCommand.ExecuteNonQuery ( http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery。 .aspx)。

就像是:

cmd.CommandText = "UPDATE userscore SET score = @score WHERE username = @username";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
var numRowsAffected cmd.ExecuteNonQuery();
if(numRowsAffected == 0)
{
  cmd.CommandText = "INSERT INTO userscore (username, score)VALUES(@username,   @score)";
  cmd.ExecuteNonQuery();
}
于 2013-03-15T19:47:41.110 回答