MySqlCommand 類別代表要針對 MySQL 資料庫執行的 SQL 陳述式。類別方法可讓您執行下列資料庫操作
查詢資料庫
插入、更新和刪除資料
傳回單一值
若有需要,以命令為基礎的資料庫操作可以在交易內執行。如需示範如何以及何時使用 ExecuteReader
、ExecuteNonQuery
和 ExecuteScalar
方法的簡短教學課程,請參閱第 6.1.2 節,〈MySqlCommand 物件〉。
可以組織 MySqlCommand
的執行個體以作為預備陳述式,以加快執行速度和重複使用,或作為預存程序。彈性的類別屬性集可讓您以數種形式封裝 MySQL 命令。本節其餘部分說明下列 MySqlCommand
屬性
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
屬性可讓您控制用來建立 SQL 查詢的資料。定義參數是減少取得不必要或惡意輸入風險的慣用做法。如需使用資訊和範例,請參閱
從 Connector/NET 8.0.26 開始,可以組織 MySqlCommand
的執行個體來執行簡單的 Transact-SQL 陳述式或預存程序,這兩者都可以在預備陳述式中使用,以加快執行速度和重複使用。必須在伺服器上安裝 query_attributes
元件 (請參閱使用查詢屬性的必要條件),才能在伺服器端搜尋和使用屬性。
查詢屬性支援因伺服器版本而異
在 MySQL 伺服器 8.0.23 之前:不支援查詢屬性。
MySQL 伺服器 8.0.23 到 8.0.24:僅支援一般陳述式中的查詢屬性。
MySQL 伺服器 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
屬性設定逾時時間。以下程式碼片段設定了一分鐘的逾時時間
MySqlCommand cmd = new MySqlCommand();
cmd.CommandTimeout = 60;
預設值為 30 秒。避免使用值 0,這表示無限等待。若要變更預設命令逾時時間,請使用連線字串選項 Default Command Timeout
。
Connector/NET 支援與 Microsoft 處理 SqlCommand.CommandTimeout
的方式一致的逾時時間。此屬性是命令執行或結果處理期間所有網路讀寫的累積逾時時間。即使在返回第一行後,MySqlReader.Read
方法中仍可能發生逾時,並且不包括使用者處理時間,僅包括 I/O 操作。
有關此方面的更多詳細資訊,請參閱相關的 Microsoft 文件。