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();

このコマンドは機能しますが、ボタンがクリックされるたびに 2 つの値が my sql データベースに保存されます。テキストボックスからスコア値を取得しますが、ユーザー名+スコアがすでにデータベースにある場合は、値を更新したいと思います。誰かがこれを行うためのクエリを手伝ってくれますか?

私の質問を明確にするために:現在のスコアよりも低くても新しいスコアを保存したいのですが、ユーザー名はテーブル内で一意です。

4

4 に答える 4

3

グローバルなハイスコアを 1 つだけ保存するのではなく、ユーザー名ごとに 1 つのハイスコアだけを保存したいと思います。

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との 2 つのパラメーターが必要@scoreです。variale@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ステートメントは、一致するレコードが存在する場合は更新を実行し、存在しない場合は挿入を実行します。これもすべて 1 つのステートメントであるため、最初にレコードの存在を確認する必要はありません。

コピー/貼り付けバージョンは次のとおりです。

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 に答える
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 に答える