The MySqlCommand class represents a SQL statement to execute against a MySQL database. Class methods enable you to perform the following database operations:
Query a database
Insert, update, and delete data
Return a single value
Command-based database operations can run within a transaction, if
needed. For a short tutorial demonstrating how and when to use the
ExecuteReader
,
ExecuteNonQuery
, and
ExecuteScalar
methods, see
Section 6.1.2, “The MySqlCommand Object”.
An instance of MySqlCommand
can be organized to
execute as a prepared statement for faster excecution and reuse,
or as a stored procedure. A flexible set of class properties
permits you to package MySQL commands in several forms. The
remainder of this section describes following
MySqlCommand
properties:
The MySqlCommand
class provides the
CommandText
and
CommandType
properties that you may combine
to create the type of SQL statements needed for your project.
The CommandText
property is interpreted
differently, depending on how you set the
CommandType
property. The following
CommandType
types are permitted:
Text
- An SQL text command (default).StoredProcedure
- Name of a stored procedure.TableDirect
- Name of a table.
The default CommandType
type,
Text
, is used for executing queries and other
SQL commands. See
Section 6.1.2, “The MySqlCommand Object” for usage
examples.
If CommandType
is set to
StoredProcedure
, set
CommandText
to the name of the stored
procedure to access. For use-case examples of the
CommandType
property with type
StoredProcedure
, see
Section 5.5, “Creating and Calling Stored Procedures”.
If CommandType
is set to
TableDirect
, all rows and columns of the
named table are returned when you call one of the execute
methods. In effect, this command performs a SELECT
*
on the table specified. The
CommandText
property is set to the name of
the table to query. This usage is illustrated by the following
code snippet:
...
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]...);
}
...
The Parameters
property gives you control
over the data you use to build a SQL query. Defining a parameter
is the preferred practice to reduce the risk of acquiring
unwanted or malicous input. For usage information and examples,
see:
As of Connector/NET 8.0.26, an instance of
MySqlCommand
can be organized to execute
simple Transact-SQL statements or stored procedures, both can be
used in a prepared statement for faster execution and reuse. The
query_attributes
component must be installed
on the server (see
Prerequisites for Using Query Attributes) before
attributes can be searched for and used on the server side.
Query-attributes support varies by server version:
Prior to MySQL Server 8.0.23: no support for query attributes.
MySQL Server 8.0.23 to 8.0.24: support for query attributes in regular statements only.
MySQL Server 8.0.25 and higher: support for query attributes in both regular and prepared statements.
If you send query attribute metadata to a server that does not support query attributes, the attempt is logged by the connector but no error is emitted.
Like parameters, attributes must be named. Unlike a parameter, an attribute represents an object from the underlying query, such as a field or table. Connector/NET does not check or enforce whether your attribute names are unique. Parameters and attributes can be combined together in commands without restrictions.
You can declare an attritue name and value directly by using the
SetAttribute
method to create an instance of
MySqlAttribute
that is exposed in a
collection through the
MySqlAttributeCollection
object within
MySqlCommand
. For example, to declare a
single attribute named qa1
, use the following
C# syntax:
myCommand.Attributes.SetAttribute("qa1", "qaValue");
Alternatively, you can declare a variable of type
MySqlAttribute
to hold your attribute name
and value. Both forms persist the attribute after the query is
executed, until the Clear
method is called on
the MySqlAttributeCollection
object. The next
snippet declares two attributes named qa1
and
qa2
as variables
mySqlAttribute1
and
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);
With attribute names and values defined, a statement specifying
attributes can be sent to the server. The following
SELECT
statement includes the
mysql_query_attribute_string()
loadable
function that is used to retrieve the two attributes decared
previously and then prints the results. For more readable and
convenient syntax, the $
symbol is used in
this example to identify string literals as interpolated
strings.
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
*/
The following code block shows the same process for setting attributes and retrieving the results using Visual Basic syntax.
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
Commands can have a timeout associated with them. This feature
is useful as you may not want a situation were a command takes
up an excessive amount of time. A timeout can be set using the
CommandTimeout
property. The following code
snippet sets a timeout of one minute:
MySqlCommand cmd = new MySqlCommand();
cmd.CommandTimeout = 60;
The default value is 30 seconds. Avoid a value of 0, which
indicates an indefinite wait. To change the default command
timeout, use the connection string option Default
Command Timeout
.
Connector/NET supports timeouts that are aligned with how Microsoft
handles SqlCommand.CommandTimeout
. This
property is the cumulative timeout for all network reads and
writes during command execution or processing of the results. A
timeout can still occur in the
MySqlReader.Read
method after the first row
is returned, and does not include user processing time, only IO
operations.
Further details on this can be found in the relevant Microsoft documentation.