文档首页
MySQL Connector/NET 开发人员指南
相关文档 下载此手册
PDF (US Ltr) - 1.3Mb
PDF (A4) - 1.3Mb


5.2 使用 MySqlCommand

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

  • 查询数据库

  • 插入、更新和删除数据

  • 返回单个值

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

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

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 查询的数据。定义参数是最佳实践,以降低获取不需要或恶意输入的风险。有关使用信息和示例,请参阅

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 的实例,该实例通过 MySqlCommand 中的 MySqlAttributeCollection 对象在集合中公开。例如,要声明名为 qa1 的单个属性,请使用以下 C# 语法

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

或者,您可以声明一个 MySqlAttribute 类型的变量来保存您的属性名称和值。这两种形式都会在查询执行后保留属性,直到在 MySqlAttributeCollection 对象上调用 Clear 方法为止。下一个代码段将两个名为 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);

在定义了属性名称和值之后,可以将包含属性的语句发送到服务器。以下 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 属性设置超时时间。以下代码片段设置了 1 分钟的超时时间

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

默认值为 30 秒。避免使用 0 值,这表示无限期等待。要更改默认命令超时时间,请使用连接字符串选项 Default Command Timeout

Connector/NET 支持与 Microsoft 处理 SqlCommand.CommandTimeout 方式一致的超时时间。此属性是命令执行期间或处理结果期间所有网络读写操作的累积超时时间。在返回第一行后,超时仍可能发生在 MySqlReader.Read 方法中,并且不包括用户处理时间,仅包括 IO 操作。

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