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

internal bool EmailAlreadyExists(string email)
    {
        foreach(var currentEmail in someList) 
        {
          if(currentEmail.Equals(email) { return false; }
        }
        return true;
    }

Код, который у меня есть, выглядит так:

internal bool EmailAlreadyExists(string email)
    {
        _msqlCon.Open();
        _query = "SELECT email FROM RegisteredUsers";
        _command = new MySqlCommand(_query, _msqlCon);

        foreach(var currentEmail in ???)
    }

Как я могу поступить отсюда?

0
user1960836 8 Мар 2015 в 18:58

2 ответа

Вы можете использовать DataReader для чтения значений из базы данных.

var list = new List<string>();

MySqlCommand cmd = new MySqlCommand(query, connection);

MySqlDataReader dataReader = cmd.ExecuteReader();

while (dataReader.Read())
{
    list.Add(dataReader["email"].ToString());
}

dataReader.Close();

Вы можете проверить существование электронной почты непосредственно в базе данных

_query = "SELECT email FROM RegisteredUsers WHERE email = @Email";

_command.Parameters.Add("@Email", SqlDbType.String);

И список будет возвращать только записи, соответствующие электронной почте. Пусто, если совпадений нет.

2
BrunoLM 8 Мар 2015 в 19:07

Я думаю о меньшем количестве кода и меньшем количестве действий; этот код лучше:

query = "SELECT email, isnull(count(email), 0) as NUM FROM RegisteredUsers GROUP BY email";
DataTable dt = new DataTable();
SqlDataAdapter sql = new SqlDataAdapter(query, connection);
sql.Fill(dt);

if (Int32.Parse(dt.Rows[0][1].ToString()) > 0)
    // your email is more than one or repeated

И dt[0][0] возвращает email.

0
shA.t 13 Май 2015 в 16:20