2013-07-01 1 views
0

Привет, я хочу знать, есть ли более упрощенный метод, чем тот, который используется сейчас, чтобы найти, есть ли запись или нет в mysql db.Как проверить mysql db для записи с меньшим кодом

public static bool check_db_entry(string query) 
{ 
    using (var conn = new MySqlConnection(DbMethods.constr)) 
    { 
     using (var cmd = new MySqlCommand(query, conn)) 
     { 
      conn.Open(); 
      using (var rdr = cmd.ExecuteReader()) 
      { 
       if (rdr.Read() == false) 
       { 
        return false; 
       } 
       else 
       { 
        return true; 
       } 
      } 
     } 
    } 
} 
+0

вы начинаете новое соединение каждый раз, когда вы вызываете эту функцию? Производительность будет ужасной. – Trent

+2

@Trent - это правильный способ сделать это. Связи в .Net объединены, поэтому на самом деле это довольно эффективно. –

+1

Для начала вы можете сделать: 'return rdr.Read()' –

ответ

1

Оставляя в стороне теперь тот факт, что методы которые принимают только строки sql, по своей сути небезопасны, это мне плохо. Если у вас будут общедоступные методы, которые принимают произвольные SQL-команды (помните: я сказал «Если»), то, несомненно, у вас есть тот, который возвращает данные напрямую. Вы должны полагаться на это как на свою базу. Вот пример:

private static IEnumerable<IDataRecord> GetDataImpl(string query) 
{ 
    using (var conn = new MySqlConnection(DbMethods.constr)) 
    using (var cmd = new MySqlCommand(query, conn)) 
    { 
     conn.Open(); 

     using (var rdr = cmd.ExecuteReader()) 
     { 
      yield return rdr; 
     } 
    } 
} 

public static bool check_db_entry(string query) 
{ 
    return GetDataImpl(query).Any(); 
} 

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

public static IEnumerable<T> GetData<T>(string query, Func<IDataRecord,T> copy) 
{ 
    return GetDataImpl(query).Select(copy); 
} 
+0

Очень полезно и безопасно, спасибо большое. – Incognito

1

Принимая сторону ваши вопросы дизайна указали в комментариях на вопрос, в, если вы хотите, чтобы проверить существование записи в базе данных, вы всегда должны запрашивать с COUNT(*): SELECT COUNT(*) FROM yourTable [WHERE theCondition].

Если это все, что вы передаете в вашу функцию, вы можете затем просто с:

public static bool check_db_entry(string query) 
{ 
    using (var conn = new MySqlConnection(DbMethods.constr)) 
    { 
     conn.Open(); 
     using (var cmd = new MySqlCommand(query, conn)) 
     { 
      return (int)cmd.ExecuteScalar() == 1; 
     } 
    } 
} 

И если вы хотите, чтобы оптимизировать его:

public static bool check_db_entry(string query) 
{ 
    using (var conn = new MySqlConnection(DbMethods.constr)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = query; 

     return (int)cmd.ExecuteScalar() == 1; 
    } 
} 
Смежные вопросы