Запросы на возврат другого запроса с использованием C # в пределах одного подключения MySQL

0

У меня есть приложение С#, над которым я работаю, и хочу запустить запрос, а затем запустить другой запрос в выходном файле ExecuteReader. Мой вопрос в том, что это можно сделать в рамках одного соединения или мне нужно закрыть и повторно открыть соединение каждый раз, когда я хочу запустить новый запрос?

Теги:

5 ответов

0
Лучший ответ

Вы можете запускать один запрос за другим, используя одно и то же соединение. Однако DataReader использует соединение для чтения результата, поэтому вам нужно прочитать результат и закрыть его, прежде чем вы сможете запустить следующий запрос.

Если вам нужно будет запустить другой запрос для каждой строки в результате, вам сначала нужно будет прочитать результат в коллекции, чтобы вы могли закрыть читатель, прежде чем перебирать результат. В качестве альтернативы вы можете открыть другое соединение, но лучше придерживаться единственного соединения, если это возможно.

Также подумайте, можете ли вы получить результат в одном запросе, используя соединение. Лучше запускать один запрос, чем сотни.

  • 0
    Хороший ответ. Я не упомянул о закрытии читателя.
  • 0
    Я должен сказать, что это именно то, что я думал, DataReader может быть использован только один раз для этого соединения. В результате, поскольку для вывода результата вам нужен DataReader, вам необходимо открыть и закрыть соединение. Это то же самое, если у вас есть DataReader и ExecuteNonQuery?
Показать ещё 3 комментария
1

Вам не нужно закрывать его.

using(connection...)
{
query1;
query2;
}
  • 0
    Спасибо, ты имеешь в виду, как это? using (MySqlConnection conn = new MySqlConnection (global.connectionString)) {MySqlCommand qry1 = new MySqlCommand ("ВЫБРАТЬ что-то из таблицы1"); MySqlDataReader res_qry1 = qry1.ExecuteReader (); while (res_qry1.Read ()) {MySqlCommand qry2 = new MySqlCommand («ВЫБЕРИТЕ что-то из таблицы 2»); MySqlDataReader res_qry2 = qry2.ExecuteReader (); }
  • 0
    Пока вы закрываете читатель, когда закончите с ним, перед выполнением следующего запроса, как указал Гуффа.
Показать ещё 1 комментарий
1

Вы можете повторно использовать соединение. Возможно, вам придется изменить CommandType, но вам не нужно закрывать и снова открывать соединение. Это добавляет лишние накладные расходы.

  • 0
    Будет ли CommandType не всегда текст для запросов? MySqlCommand qry = new MySqlCommand ("ВЫБРАТЬ что-нибудь из таблицы1"); qry.CommandType = System.Data.CommandType.Text; qry.Connection = conn; MySqlDataReader res = qry.ExecuteReader ();
  • 0
    Если вы выполняете запросы таким образом, да, это останется текстом.
0

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

Ссылка MSDN для DataTableReader

0

Вы можете сделать это с помощью одного соединения.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню