2014-11-28 5 views
0

Я использую MySQL всего один день, чтобы обрабатывать систему входа в систему, и я столкнулся с проблемой при создании нового пользователя. У меня есть 3 поля, о которых мне нужно беспокоиться, Отображаемое имя, имя пользователя и адрес электронной почты. Теперь мне нужно проверить, имеет ли какое-либо из полей уже запись в базе данных. Таким образом, если отображаемое имя, которое было дано уже в базе данных, то он должен показать сообщение «Отображаемое имя уже принято» и то же самое для других 2.MySQL Количество столбцов в одном запросе

Я уже читал бесчисленные сообщения где люди используют SELECT COUNT и т. д., но я до сих пор не смог поместить его в свой собственный проект.

Как я могу это сделать?

ответ

0

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

string sql = "SELECT Nickname, Username, Email " 
     + " FROM UserData WHERE (Nickname=?Nickname OR Username=?Username OR Email=?Email)"; 

MySqlCommand check = new MySqlCommand(sql, conn); 
conn.Open(); 
check.Parameters.AddWithValue("?Nickname", txtCreateName.Text); 
check.Parameters.AddWithValue("?Username", txtCreateUserName.Text); 
check.Parameters.AddWithValue("?Email", txtCreateEmail.Text); 
MySqlDataReader Reader; 
Reader = check.ExecuteReader(); 

List<string> Nicknames = new List<string>(); 
List<string> Usernames = new List<string>(); 
List<string> Email = new List<string>(); 

while (Reader.Read()) 
{ 
    Nicknames.Add(Reader.GetString(0)); 
    Usernames.Add(Reader.GetString(1)); 
    Email.Add(Reader.GetString(2)); 
} 
conn.Close(); 
Reader.Close(); 
Boolean alreadyexists = false; 


if (Nicknames.Contains(txtCreateName.Text)) 
{ 
    alreadyexists = true; 
    lblErrorDisplay.Visible = true; 
} 
if (Usernames.Contains(txtCreateUserName.Text)) 
{ 
    alreadyexists = true; 
    lblErrorUsername.Visible = true; 

} 
if (Email.Contains(txtCreateEmail.Text)) 
{ 
    alreadyexists = true; 
    lblErrorEmail.Visible = true; 
} 
if (alreadyexists) 
{ 
    return; 
} 

Если у кого есть какие-то улучшения в этом коде будет высоко ценится, но это будет работать в настоящее время.

+0

Это решение не удовлетворяет условиям гонки. Вы должны либо закрыть таблицу перед выполнением проверки, либо разблокировать ее после того, как вы введете нового пользователя, или, более предпочтительно, просто создайте УНИКАЛЬНЫЕ ИНДЕКСЫ, как описано в моем ответе. – sidon

0

Просто создайте UNIQUE INDEX на каждом из этих полей. Таким образом, вы можете быть уверены, что не будет никаких дубликатов, потому что DB обрабатывает это внутренне. А также нет состояние гонки.

Чтобы обработать дублируемую вставку, просто проверьте код ошибки.

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