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