2015-09-22 4 views
0

у меня есть это окно код формыПроверьте проигрыватель существует ошибку

private void StartGame_Click(object sender, EventArgs e) 
{ 

    if (player.Text == "") 
    { 
     MessageBox.Show("Enter A player to proceed."); 
    } 
    else 
    { 
    //SQL Connection String 
     using (SqlConnection conn = new SqlConnection("Data Source=Keith;Initial Catalog=SoftEngg;Integrated Security=True")) 
     { 
      conn.Open(); 

      bool exists = false; 

      // create a command to check if the username exists 
      using (SqlCommand cmd = new SqlCommand("select * from PlayerData where PlayerName = @player", conn)) 
      { 
       cmd.Parameters.AddWithValue("player", player.Text); 
       exists = (int)cmd.ExecuteScalar() > 0; 
      } 

      // if exists, show a message error 
      if (exists) 
       MessageBox.Show(player.Text, "is used by another user."); 
      else 
      { 
       // does not exists, so, persist the user 
       using (SqlCommand cmd = new SqlCommand("INSERT INTO PlayerData(PlayerName) values (@Playername)", conn)) 
       { 
        cmd.Parameters.AddWithValue("Playername", player.Text); 

        cmd.ExecuteNonQuery(); 
       } 
      } 

      conn.Close(); 
     } 
    } 
} 

моя цель состоит, чтобы предупредить игрок и отобразить MessageBox «игрок уже существует» в системе. Но мой код, похоже, не работает. Когда я запускаю программу, я получаю сообщение об ошибке на этот код здесь:

exists = (int)cmd.ExecuteScalar() > 0; 

и ошибка говорит: (Дополнительная информация: Ссылка на объект не указывает на экземпляр объекта.)

Как это исправить , пожалуйста помоги.

+2

'cmd.Parameters.AddWithValue ("@ игрок", player.Text);' Кроме того, если запрос ничего не возвращает, он не может превратить это в 'int', поэтому вам нужно это проверить. – LarsTech

+0

спасибо за напоминание, но я все еще получаю сообщение об ошибке в том, что существует код = (int) cmd.ExecuteScalar()> 0; –

ответ

3

Вы должны использовать select Count(*) from PlayerData where PlayerName = @player, если вы хотите использовать ExecuteScalar

+0

спасибо вам работа. –

+0

@laurencekeithalbano приветствуется :) –

2

Вашей проблемы не в запросе. я имею в виду не в этом select * from PlayerData where PlayerName = @player

вы получаете сообщение об ошибке из-за exists = (int)cmd.ExecuteScalar() > 0;

Причина: здесь вы пытаетесь convert выход к Integer. так, когда cmd.ExecuteScalar() Получение null Значение на тот момент, когда вы получаете сообщение об ошибке.

должны помнить

SqlCommand.ExecuteScalar: 

Выполняет запрос и возвращает первый столбец первой строки в результирующий набор, возвращаемый запросом. Дополнительные столбцы или строки: игнорируются.

вы можете использовать select * from PlayerData where PlayerName = @player но вы должны подтвердить, что первый столбец этой таблицы является NonNullable столбец.

и ваша проверка должна быть как

exists = (cmd.ExecuteScalar()!=null)?true:false; 

Или, вы можете попробовать путем выбора столбца первичного ключа.

select your_Primary_Key_Name from PlayerData where PlayerName = @player 

и проверить

exists = (cmd.ExecuteScalar()!=null)?true:false; 

do not use AddWithValue

cmd.Parameters.Add("@player",SqlDbType.Varchar,200).Value=YourValue; 
+0

Я думаю, мы можем сделать просто exist = cmd.ExecuteScalar()! = Null; – brykneval

+0

@brykneval да, хорошая точка, не нужно использовать условный operator.i пропустил это. :) спасибо за предложение. –

Смежные вопросы