C# ExecuteScalar()

Я пытаюсь сделать игру в крэпс, сохранить пользователей / игровые данные и т. Д. В этой задаче я пытаюсь проверить, не занято ли уже имя пользователя. Но по какой-то причине, независимо от того, как я пытаюсь объявить свою переменную для получения в результате ExecuteScalar(), я всегда получаю ошибку "Не удается преобразовать из nVarChar в int".

private bool CheckForUser()
{
        //returns true if Username is already registered
        SqlConnection connection = new SqlConnection("...");
        string query = "SELECT * FROM Users WHERE USERID = @alias";
        SqlCommand cmd = new SqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@alias", tbNewUsername.Text);
        connection.Open();
        Object DbResult = cmd.ExecuteScalar(); //<-ERROR
        connection.Close();
        DbResult = (DbResult == DBNull.Value) ? null : DbResult;

        if (DbResult != null)
            return true;
        else
            return false;

}

Это была моя последняя попытка, прежде чем искать помощи. Приведение к int не работает, string не работает, а объявление DbResult как объекта не работает. Я понимаю, почему он не может быть преобразован в int, но я не знаю, почему он продолжает пытаться.

Спасибо за любую помощь.

2 ответа

Проведение такого рода проверки в графическом интерфейсе, а не в БД, вероятно, плохая идея. Таким образом вы столкнетесь только с условиями гонки. Обычно вы:

  • Настроить таблицу, чтобы разрешить только уникальные (логин) имена
  • попробуйте вставить конкретного нового пользователя
  • вставка не работает или не дает сбой

Вещи, как сообщить зарегистрированному пользователю имя уже взять? Это дополнительная функция качества жизни для пользовательского интерфейса регистра, а не основная вещь.

Ошибка компилятора не делает никакой ошибки с кодом, который вы показали. Это оставляет только один вариант: что-то еще - вероятно, намного выше этих строк - так плохо запутывает компилятор, что не может даже сказать вам, где проблема больше.

Изменить: Другая проблема заключается в том, что вы не Dipose of the Connection. Это вызовет у вас проблемы. Вы всегда должны реализовывать шаблон использования с сетевыми подключениями и доступом к файлам. И все остальное, что реализует IDisposeable.

Вы смотрели на примеры в Microsoft? У них есть следующий пример, который говорит вам, как использовать ExecuteScalar функция и какой тип возвращаемого значения ожидать:

cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";  
Int32 count = (Int32) cmd.ExecuteScalar();  
Другие вопросы по тегам