2010-03-11 5 views
0

У меня есть «рабочая» функция, которая будет обрабатывать любые и все sql-запросы в моей программе. Мне нужно будет выполнить запросы, которые возвращают наборы результатов и те, которые просто выполняют хранимые процедуры без каких-либо результатов. Возможно ли это с помощью MySqlDataAdapter.Fill или мне нужно использовать метод MySqlCommand.ExecuteNonQuery()? Вот моя функция «рабочий» для справки:Что возвращает MySqlDataAdapter.Fill, когда результаты пустые?

private DataSet RunQuery(string SQL) 
    { 
     MySqlConnection connection; 
     MySqlCommand command; 
     MySqlDataAdapter adapter; 
     DataSet dataset = new DataSet(); 

     lock(locker) 
     { 
      connection = new MySqlConnection(MyConString); 
      command = new MySqlCommand(); 
      command = connection.CreateCommand(); 
      command.CommandText = SQL; 
      adapter = new MySqlDataAdapter(command); 
      adapter.Fill(dataset); 
     } 

     return dataset; 
    } 

ответ

1

Во-первых, ваша функция работник будет сгенерировано исключение по методу .Нанести (набор данных). Вы должны построить свой адаптер с выбором команды, как:

adapter = new MySqlDataAdapter(command); 

результатом nonquery работает против Заливки приведет к набору данных с не возвращаются никаких таблиц.

Однако: Использование команд ADO.NET, таких как Adapter.Fill (набор данных) для выполнения команды без запроса, очень неэффективно по сравнению с использованием метода cmd.ExecuteNonQuery().

Помимо создания отдельного и избыточного объекта DataAdapter, каждый вызов, выполняемый в ADO.NET, является виртуальным и должен быть разрешен для узла вызова во время выполнения CLR. При загрузке этот метод непрерывно будет приводить к большому давлению GC с объектом DataAdapter, требующим непрерывной утилизации, и будет заметно медленнее, чем просто выполняемая команда. ExecuteNonQuery();

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