2013-05-15 2 views
0

У меня есть этот код, который подсчитывает количество записей с тем же годом и датой. Но когда я запускаю приложение, он не работает. Вот мой код:Подсчет определенного количества записей с использованием MySqlDataReader

try 
{ 
    string query = "SELECT * FROM tblOrder WHERE [email protected]"; 

    MySqlCommand cmd = new MySqlCommand(query, con); 
    cmd.Parameters.AddWithValue("@dateTimeNow", Convert.ToDateTime(DateTime.Now).ToString("yyyy-MM")); 

    MySqlDataReader dr = cmd.ExecuteReader(); 

    MessageBox.Show("OK"); 
    con.Open(); 

    while (dr.Read()) 
    { 
     count++; 
    } 

    dr.Close(); 
    con.Close(); 
} 
catch (Exception) 
{ 

} 
+0

Offtopic 'DateTime.Now' является alreadty' DateTime' вам не нужно 'Convert' – V4Vendetta

+0

Можете ли вы объяснить, как вы заключаете * когда я запускаю приложение, оно не работает * part – V4Vendetta

+1

Что не работает? Не пишите пустой блок catch, который скрывает исключение без каких-либо предупреждений или сообщений, чтобы вы знали, что не так с вашим кодом. – Steve

ответ

1

Во-первых у вас есть пустой поймать блок, который не имеет никакого смысла

Atleast это было бы лучше

catch (Exception ex) 
{ 
    MessageBox(ex.Message);// you would know if in case it failed 
} 

Теперь проблема, как представляется,

MySqlDataReader dr = cmd.ExecuteReader(); 

MessageBox.Show("OK"); 
con.Open(); <--- opening after executing the reader ! 

вы должны попробовать поставив соединение в используемом блоке

using(MySqlConnection con = new MySqlConnection()) 
{ 
//your stuff in here 
} 

Другое наблюдение

cmd.Parameters.AddWithValue("@dateTimeNow", Convert.ToDateTime(DateTime.Now).ToString("yyyy-MM"))

DateTime.Now является DateTime нет необходимости Convert снова

0

Вы можете SELECT COUNT(*) FROM ..., а затем использовать cmd.ExecuteScalar(), чтобы получить количество возвращенного.

+0

Как это сделать? – Harvey

1

Лучший подход к вашей проблеме через ExecuteScalar (ссылка для SqlServer но это то же самое для MySql) и используя функция COUNT

using(MySqlConnection con = new MySqlConnection("your_connection_string_here")) 
{ 
     con.Open(); 
     string query = "SELECT COUNT(*) FROM tblOrder WHERE [email protected]"; 
     using(MySqlCommand cmd = new MySqlCommand(query, con)) 
     { 
      cmd.Parameters.AddWithValue("@dateTimeNow", DateTime.Now.ToString("yyyy-MM"); 
      int count = (int)cmd.ExecuteScalar(); 
      Console.WriteLine("There are " + count.ToString() + " records"); 
     } 
} 

Как вы можете видеть, я удалил попытку/который бесполезен здесь, потому что вы ничего не делаете с исключением. Это остановит программу, если ваш запрос содержит синтаксическую ошибку или вы не можете установить соединение с сервером. Так что, если попробовать/поймать действительно необходимо, зависит от ваших требований

(Добавлено также наблюдение на DateTime.Now от V4Vendetta)

+0

Какова польза/эффект использования 'using block' по сравнению с чем-либо? – Harvey

+0

См. [Using statement] (http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.80%29.aspx) В основном, оператор using представляет собой блок try/finally, где блок finally закрыть и удалить объект, объявленный и инициализированный в строке использования. Этот синтаксис является элегантным и эффективным. Это устраняет возможность утечки ресурсов, что, особенно в случае подключения к базе данных, является очень дорогостоящим.Если по какой-либо причине вы получаете исключение внутри используемого блока, вам гарантируется, что ваш код выполнит закрытие и удалит объект в закрывающей скобке. – Steve

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

  • Нет связанных вопросов^_^