MySqlCommand 类表示针对 MySQL 数据库执行的 SQL 语句。类方法使您能够执行以下数据库操作:
查询数据库
插入、更新和删除数据
返回单个值
如果需要,基于命令的数据库操作可以在事务中运行。有关演示如何以及何时使用 、 和 方法的简短教程
ExecuteReader
,
ExecuteNonQuery
请
ExecuteScalar
参阅
第 4.6.1.2 节“MySqlCommand 对象”。
的实例MySqlCommand
可以组织为作为准备好的语句执行,以便更快地执行和重用,或作为存储过程执行。一组灵活的类属性允许您以多种形式打包 MySQL 命令。本节的其余部分描述了以下
MySqlCommand
属性:
该类MySqlCommand
提供了
CommandText
和
CommandType
属性,您可以结合这些属性来创建项目所需的 SQL 语句类型。根据CommandText
您设置
CommandType
属性的方式,对属性的解释不同。允许以下
CommandType
类型:
Text
- SQL 文本命令(默认)。StoredProcedure
- 存储过程的名称。TableDirect
- 表的名称。
默认CommandType
类型
Text
用于执行查询和其他 SQL 命令。有关使用示例,请参阅
第 4.6.1.2 节,“MySqlCommand 对象”。
如果CommandType
设置为
StoredProcedure
,则设置
CommandText
为要访问的存储过程的名称。有关
CommandType
type 属性的用
例示例StoredProcedure
,请参阅
第 4.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# 语法:
MySqlAttributeCollection
MySqlCommand
qa1
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);
定义了属性名称和值后,可以将指定属性的语句发送到服务器。以下
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
属性设置超时。以下代码片段将超时设置为一分钟:
MySqlCommand cmd = new MySqlCommand();
cmd.CommandTimeout = 60;
默认值为 30 秒。避免值为 0,这表示无限期等待。要更改默认命令超时,请使用连接字符串选项Default
Command Timeout
。
Connector/NET 支持与 Microsoft 处理SqlCommand.CommandTimeout
. 此属性是命令执行或结果处理期间所有网络读取和写入的累积超时。返回第一行后方法中仍可能发生超时
MySqlReader.Read
,并且不包括用户处理时间,仅包括 IO 操作。
有关这方面的更多详细信息,请参阅相关的 Microsoft 文档。