文件首頁
MySQL Connector/NET 開發人員指南
相關文件 下載本手冊
PDF (美式信紙) - 1.3Mb
PDF (A4) - 1.3Mb


5.2 使用 MySqlCommand

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 設定為要存取的預存程序名稱。如需使用 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 伺服器 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 方法為止。下一個程式碼片段宣告了兩個名為 qa1qa2 的屬性,分別作為變數 mySqlAttribute1mySqlAttribute2

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 方法中仍可能發生逾時,並且不包括使用者處理時間,僅包括 I/O 操作。

有關此方面的更多詳細資訊,請參閱相關的 Microsoft 文件