5.2 使用 MySql 命令

MySqlCommand 类表示针对 MySQL 数据库执行的 SQL 语句。类方法使您能够执行以下数据库操作:

  • 查询数据库

  • 插入、更新和删除数据

  • 返回单个值

如果需要,基于命令的数据库操作可以在事务中运行。有关演示如何以及何时使用 、 和 方法的简短教程 ExecuteReaderExecuteNonQueryExecuteScalar参阅 第 6.1.2 节“MySqlCommand 对象”

的实例MySqlCommand可以组织为作为准备好的语句执行,以便更快地执行和重用,或作为存储过程执行。一组灵活的类属性允许您以多种形式打包 MySQL 命令。本节的其余部分描述了以下 MySqlCommand属性:

CommandText 和 CommandType 属性

该类MySqlCommand提供了 CommandTextCommandType属性,您可以结合这些属性来创建项目所需的 SQL 语句类型。根据CommandText您设置 CommandType属性的方式,对属性的解释不同。允许以下 CommandType类型:

  • Text- SQL 文本命令(默认)。

  • StoredProcedure- 存储过程的名称。

  • TableDirect- 表的名称。

默认CommandType类型 Text用于执行查询和其他 SQL 命令。有关使用示例,请参见 第 6.1.2 节“MySqlCommand 对象”

如果CommandType设置为 StoredProcedure,则设置 CommandText为要访问的存储过程的名称。有关 CommandTypetype 属性的用 例示例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属性使您可以控制用于构建 SQL 查询的数据。定义参数是降低获取不需要的或恶意输入的风险的首选做法。有关使用信息和示例,请参阅:

属性属性

从 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方法创建一个实例, 该实例通过 .within 中的对象在 MySqlAttribute集合中公开 。例如,要声明名为 的单个属性,请使用以下 C# 语法: MySqlAttributeCollectionMySqlCommandqa1

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

或者,您可以声明一个类型的变量 MySqlAttribute来保存您的属性名称和值。两种形式都在执行查询后保留属性,直到在对象Clear上调用该方法。下一个代码片段声明了两个名为和 的MySqlAttributeCollection属性,作为变量 和 。 qa1qa2mySqlAttribute1mySqlAttribute2

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);

定义了属性名称和值后,可以将指定属性的语句发送到服务器。以下 SELECT语句包含 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,并且不包括用户处理时间,仅包括 IO 操作。

有关这方面的更多详细信息,请参阅相关的 Microsoft 文档