Spec-Zone.ru › MySQL Connectors 1.0

5.2 Использование MySqlCommand

Класс MySqlCommand представляет SQL-запрос для выполнения против базы данных MySQL. Методы класса позволяют выполнять следующие операции с базой данных:

  • Выполнение запроса к базе данных

  • Вставка, обновление и удаление данных

  • Возврат одного значения

Операции с базой данных на основе команд могут выполняться в рамках транзакции, если это необходимо. Для краткого руководства, демонстрирующего, как и когда использовать методы ExecuteReader, ExecuteNonQuery и ExecuteScalar, см. Раздел 6.1.2, «Объект MySqlCommand».

Экземпляр MySqlCommand может быть организован для выполнения в качестве подготовленного запроса для более быстрого выполнения и повторного использования или как хранимая процедура. Гибкий набор свойств класса позволяет упаковывать команды MySQL в нескольких форматах. Остальная часть этого раздела описывает следующие MySqlCommand свойства:

  • Свойства CommandText и CommandType

  • Свойство Parameters

  • Свойство Attributes

  • Свойство CommandTimeout

Свойства CommandText и CommandType

Класс MySqlCommand предоставляет свойства CommandText и CommandType, которые можно комбинировать для создания типов SQL-запросов, необходимых для вашего проекта. Свойство CommandText интерпретируется по-разному в зависимости от того, как вы задаете свойство CommandType. Разрешены следующие CommandType типы:

  • Text — команда SQL-текста (по умолчанию).

  • StoredProcedure — имя хранимой процедуры.

  • TableDirect — имя таблицы.

Тип по умолчанию для свойства CommandType, Text, используется для выполнения запросов и других SQL-команд. Примеры использования см. в Разделе 6.1.2, «Объект MySqlCommand».

Если CommandType установлено в значение StoredProcedure, задайте CommandText имя хранимой процедуры для доступа. Примеры использования свойства CommandType с типом StoredProcedure см. в Разделе 5.5, «Создание и вызов хранимых процедур».

Если CommandType установлено в значение TableDirect, при вызове одного из методов выполнения возвращаются все строки и столбцы указанной таблицы. По сути, эта команда выполняет SELECT * над указанной таблицей. Свойство CommandText устанавливается в имя таблицы для запроса. Это использование проиллюстрировано следующим фрагментом кода:

...
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "mytable";
cmd.Connection = someConnection;
cmd.CommandType = CommandType.TableDirect;
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
   Console.WriteLn(reader[0], reader[1]...);
}
...

Свойство Parameters

Свойство Parameters предоставляет контроль над данными, используемыми для построения SQL-запроса. Определение параметра — предпочтительная практика для снижения риска получения нежелательных или вредоносных данных ввода. Справочную информацию и примеры см. в:

  • Работа с параметрами

  • Доступ к хранимой процедуре

  • Подготовка заявок в Connector/NET

Свойство Attributes

Начиная с Connector/NET 8.0.26, экземпляр MySqlCommand может быть организован для выполнения простых Transact-SQL-заявок или хранимых процедур, которые оба могут быть использованы в подготовленном заявлении для более быстрого выполнения и повторного использования. Компонент query_attributes должен быть установлен на сервере (см. ) прежде чем атрибуты могут быть найдены и использованы на стороне сервера.

Поддержка атрибутов запросов варьируется в зависимости от версии сервера:

  • До MySQL Server 8.0.23: нет поддержки атрибутов запросов.

  • MySQL Server 8.0.23 до 8.0.24: поддержка атрибутов запросов только в обычных запросах.

  • MySQL Server 8.0.25 и выше: поддержка атрибутов запросов как в обычных, так и в подготовленных запросах.

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

Как и параметры, атрибуты должны иметь имена. В отличие от параметра, атрибут представляет объект из основного запроса, например, поле или таблицу. Connector/NET не проверяет и не навязывает уникальность имен атрибутов. Параметры и атрибуты могут комбинироваться в командах без ограничений.

Вы можете объявить имя и значение атрибута непосредственно, используя метод SetAttribute для создания экземпляра MySqlAttribute, который отображается в коллекции через объект MySqlAttributeCollection в MySqlCommand. Например, чтобы объявить один атрибут с именем qa1, используйте следующий синтаксис C#:

myCommand.Attributes.SetAttribute("qa1", "qaValue");

В качестве альтернативы вы можете объявить переменную типа MySqlAttribute для хранения имени и значения атрибута. Оба варианта сохраняют атрибут после выполнения запроса до тех пор, пока не будет вызван метод Clear объекта MySqlAttributeCollection. Следующий фрагмент кода объявляет два атрибута с именами qa1 и qa2 как переменные mySqlAttribute1 и mySqlAttribute2.

MySqlCommand myCommand = new MySqlCommand();
myCommand.Connection = myConnection;

MySqlAttribute mySqlAttribute1 = new MySqlAttribute("qa1", "qaValue");
MySqlAttribute mySqlAttribute2 = new MySqlAttribute("qa2", 2);

myCommand.Attributes.SetAttribute(mySqlAttribute1);
myCommand.Attributes.SetAttribute(mySqlAttribute2);

После определения имен и значений атрибутов запрос, указывающий атрибуты, может быть отправлен на сервер. Следующий запрос включает загружаемую функцию mysql_query_attribute_string(), которая используется для извлечения двух ранее объявленных атрибутов, а затем выводит результаты. Для более удобочитаемого и удобного синтаксиса в этом примере используется символ $ для обозначения строковых литералов как интерполированных строк.

myCommand.CommandText = $"SELECT mysql_query_attribute_string('{mySqlAttribute1.AttributeName}') AS attr1," +
  $"mysql_query_attribute_string('{mySqlAttribute2.AttributeName}') AS attr2";

using (var reader = myCommand.ExecuteReader())
{
  while (reader.Read())
  {
    Console.WriteLine($"Attribute1 Value: {reader.GetString(0)}");
    Console.WriteLine($"Attribute2 Value: {reader.GetString(1)}");
  }
}

/* Output:
 Attribute1 Value: qaValue
 Attribute2 Value: 2
*/

Следующий блок кода показывает тот же процесс установки атрибутов и извлечения результатов с использованием синтаксиса Visual Basic.

Public Sub CreateMySqlCommandWithQueryAttributes(ByVal myConnection As MySqlConnection)
  Dim myCommand As MySqlCommand = New MySqlCommand()
  myCommand.Connection = myConnection
  Dim mySqlAttribute1 As MySqlAttribute = New MySqlAttribute("qa1", "qaValue")
  Dim mySqlAttribute2 As MySqlAttribute = New MySqlAttribute("qa2", 2)
  myCommand.Attributes.SetAttribute(mySqlAttribute1)
  myCommand.Attributes.SetAttribute(mySqlAttribute2)
  myCommand.CommandText = $"SELECT mysql_query_attribute_string('{mySqlAttribute1.AttributeName}') AS attr1," &
    $"mysql_query_attribute_string('{mySqlAttribute2.AttributeName}') AS attr2"

  Using reader = myCommand.ExecuteReader()
    While reader.Read()
      Console.WriteLine($"Attribute1 Value: {reader.GetString(0)}")
      Console.WriteLine($"Attribute2 Value: {reader.GetString(1)}")
    End While
  End Using
End Sub

Свойство CommandTimeout

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

MySqlCommand cmd = new MySqlCommand();
cmd.CommandTimeout = 60;

Значение по умолчанию составляет 30 секунд. Избегайте значения 0, которое означает неопределенное ожидание. Чтобы изменить значение по умолчанию для таймаута команды, используйте параметр строки подключения Default Command Timeout.

Connector/NET поддерживает таймауты, согласованные с тем, как Microsoft обрабатывает SqlCommand.CommandTimeout. Это свойство является суммарным таймаутом для всех сетевых чтений и записей во время выполнения команды или обработки результатов. Таймаут по-прежнему может возникнуть в методе MySqlReader.Read после возврата первой строки и не включает время обработки пользователя, только операции ввода-вывода.

Дополнительные сведения об этом можно найти в соответствующей документации Microsoft.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-net-en/connector-net-programming-mysqlcommand.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API