Как вставить только новые записи с помощью Linq-SQL?

Итак, здесь есть пара моментов,

Во-первых, у вашей игровой функции нет закрывающей скобки.

Во-вторых, ваша функция computerPlay внутри вашей игровой функции никогда не вызывается (и у нее также нет закрывающей скобки, но я бы все равно ее удалила)

В-третьих, ваше условие while (строка 12) срабатывает, когда computer / playerScore больше 5, но в строках 7 и 8 вы устанавливаете их на 0. Возможно, вы хотите, чтобы они были меньше или равны.

См. Исправленную версию ниже.

<!DOCTYPE HTML >
<html>

<body>
  <script>
    //Game parameters to start 
    var computerScore = 0
    var playerScore = 0

    //Game functions
    function game() {
      while (computerScore <= 5 && playerScore <= 5) {

        //Computer Selection 
        let playerSelection = prompt("Make your choice: rock, paper, or scissors!")
        let computerSelection = Math.floor(Math.random() * 3)

        //Player Selection
        if (playerSelection.toLowerCase() == "rock") {
          var playerChoice = 0;
        } else if (playerSelection.toLowerCase() == "paper") {
          var playerChoice = 1;
        } else if (playerSelection.toLowerCase() == "scissors") {
          var playerChoice = 2;
        } else {
          alert("Sorry, that word isn't recognized. Please select rock, paper, or scissors.")
        }

        //Rock
        if (computerSelection == 0) {
          var computerChoice = 0
          //Paper
        } else if (computerSelection == 1) {
          var computerChoice = 1
          //Scissors
        } else if (computerSelection == 2) {
          var computerChoice = 2
        } else {}

        //OUTCOMES 
        if (computerSelection == 0 && playerChoice == 0 || computerSelection == 1 && playerChoice == 1 || computerSelection == 2 && playerChoice == 2) {
          alert("Tie game!")
        } else if (computerSelection == 1 && playerChoice == 0) {
          alert("Paper beats rock. You lose!")
        } else if (computerSelection == 2 && playerChoice == 0) {
          alert("Rock beats scissors. You win!")
        } else if (computerSelection == 0 && playerChoice == 1) {
          alert("Paper beats rock. You win!")
        } else if (computerSelection == 0 && playerChoice == 2) {
          alert("Rock beats scissors. You lose!")
        } else if (computerSelection == 1 && playerChoice == 2) {
          alert("Scissors beat paper. You win!")
        } else if (computerSelection == 2 && playerChoice == 1) {
          alert("Scissors beat paper. You lose!")
        } else {}

        //Increments 
        if (computerSelection > playerChoice) {

          computerScore++
        } else if (computerSelection < playerChoice) {
          playerScore++
        } else {}

        if (computerScore == 5 && playerScore < 5) {
          alert("Computer wins, " + computerScore + " to " + playerScore + "!")
        } else if (playerScore == 5 && computerScore < 5) {
          alert("Player wins, " + playerScore + " to " + computerScore + "!")
        } else {}

      }
    }

    game();
  </script>

</body>

</html>

5
задан Rex M 2 May 2009 в 01:44
поделиться

2 ответа

Все, что необходимо сделать, создают новый экземпляр класса и затем называют InsertOnSumbit () на таблице:

var foo = new MyFoo { Name = "foo1" };
var dc = new MyDataContext();
dc.Foos.InsertOnSubmit(foo);
dc.SubmitChanges();

Другая вещь, в которой необходимо быть уверены, состоит в том, как Вы увеличиваете свой столбец ID. В целом я всегда удостоверяюсь, что использовал установку IDENTITY (1,1) на своих столбцах ID. Это объявляется на идентификационном столбце Вашего объекта LINQ как так:

[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]
public Int32 Id { get; set; }

Избегать дубликатов, в чем Вы действительно нуждаетесь, - то, что мы называем в моем магазине "добавлять" функциональностью. По моему скромному мнению, это наиболее легко выполняется с хранимой процедурой - у нас даже есть шаблон, который мы используем для нее:

USE [<Database_Name, sysobject, Database_Name>]
GO

CREATE PROCEDURE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>__append]
(
    @id INT OUTPUT,
    @<Key_Param, sysobject, Key_Param> <Key_Param_Type, sysobject, VARCHAR(50)>
)
AS
BEGIN

        SELECT @id = [id] FROM [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] (NOLOCK) WHERE [<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>

IF @id IS NULL  
BEGIN       
    INSERT INTO [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] ([<Key_Param, sysobject, Key_Param>]) 
    OUTPUT INSERTED.[id] INTO @inserted_ids
    VALUES (@<Key_Param, sysobject, Key_Param>)

    SELECT TOP 1 @id = [id] FROM @inserted_ids;
END
ELSE
BEGIN
    UPDATE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s]
    SET
        [<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>
    WHERE [id] = @id
END
END
GO

Возможно сделать это в linq, хотя, просто запросите для списка существующих идентификаторов (или безотносительно столбца, который Вы выключаете):

var dc = new MyDataContext();
var existingFoos = dc.Foos.ToList();
var newFoos = new List<Foo>();
foreach(var bar in whateverYoureIterating) {
// logic to add to newFoos 
}
var foosToInsert = newFoos.Where(newFoo => !existingFoos.Any(existingFoo => newFoo.Id == existingFoo.Id));

dc.Foos.InsertAllOnSubmit(foosToInsert);
dc.SubmitChanges();
// use the next line if you plan on re-using existingFoos. If that's the case I'd wrap  dc.SubmitChanges() in a try-catch as well.
existingFoos.AddRange(foosToInsert);
6
ответ дан 14 December 2019 в 04:47
поделиться

К сожалению, нет никакого пути вокруг этого, поскольку Linq к SQL не проверяет базу данных, прежде чем это выполнит вставку. Единственный способ сделать это должно запросить базу данных сначала, чтобы определить, существует ли дублирующаяся запись, и затем добавьте запись, если это не делает.

Идеально Linq к SQL поддерживал бы свойство Ignore Duplicate Keys на столбце SQL. Но к сожалению это не делает в данный момент.

2
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: