C# 更新或插入新值

C# 更新或插入新值,c#,asp.net,C#,Asp.net,我在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.Ex

我在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数据库中存储两个值。它从文本框中获取分数值,但是当用户名+分数已经在数据库中时,我想更新该值。有人能帮我查询一下吗


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

我假设每个用户名只存储一个highscore,而不是只存储一个全局highscore

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
变量。

如果用户名对于表是唯一的,则可以使用更新查询加上SqlCommand.ExecuteNonQuery()

比如:

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();
}
如果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);";

您可以使用一个存储过程,在没有分数时插入分数,或者在低于新分数时更新用户的分数

代码

cmd=connection.CreateCommand();
cmd.CommandText=“更新\高分”;
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.AddWithValue(“@username”,username);
cmd.Parameters.AddWithValue(“@score”,userscore);
cmd.ExecuteNonQuery();
执行此命令以创建存储过程

CREATE PROCEDURE update\u highscore
@用户名VARCHAR(30),
@用户分数整数
作为
更新用户分数
设置分数=@score
其中username=@username
如果@@ROWCOUNT=0
插入userscore(username,score)值(@username,@score)

SQL Server是什么数据库?需要澄清的是,如果新值高于旧值,您是希望只存储新值,还是希望不考虑存储新值?这不能满足OPs只保留最高分数的要求。这将只保留数据库中最新的分数。@jadarnel27:根据OP,他实际上并不想要最高的分数,只想要最新的分数。感谢您的跟进,@ChrisLively。您的SQL不会将
@score
与用户当前的最高分数进行比较,因此它只会记录最新的分数,而不是最高的分数。@Dai:是的,我知道。问题文本的含义与标题不同。我让OP澄清。@Dai:显然他不想要最高的,只想要最后一个。