4.5.4 在 Connector/NET 中准备语句

准备好的语句可以为多次执行的查询提供显着的性能改进。对于多次执行的语句,准备执行比直接执行更快,主要是因为查询只被解析一次。在直接执行的情况下,每次执行都会解析查询。此外,准备执行可以减少网络流量,因为对于准备语句的每次执行,只需要发送参数数据即可。

准备语句的另一个优点是,在启用服务器端准备语句的情况下,它使用二进制协议,使客户端和服务器之间的数据传输更加高效。

要准备语句,请使用以下步骤序列:

  1. 创建一个MySqlCommand对象并将 CommandText属性设置为您的查询。

  2. 输入语句后,调用 Prepare命令对象的方法。准备好语句后,为查询中的每个动态元素添加参数。

  3. ExecuteNonQuery()使用、 ExecuteScalar()ExecuteReader方法 执行语句 。

后续执行只需要修改参数的值,重新调用execute方法即可,无需设置CommandText属性或重新定义参数。

C# 代码示例

MySql.Data.MySqlClient.MySqlConnection conn;
MySql.Data.MySqlClient.MySqlCommand cmd;
conn = new MySql.Data.MySqlClient.MySqlConnection();
cmd = new MySql.Data.MySqlClient.MySqlCommand();
conn.ConnectionString = strConnection;
try
{
    conn.Open();
    cmd.Connection = conn;
    cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)";
    cmd.Prepare();
    cmd.Parameters.AddWithValue("@number", 1);
    cmd.Parameters.AddWithValue("@text", "One");
    for (int i=1; i <= 1000; i++)
    {
        cmd.Parameters["@number"].Value = i;
        cmd.Parameters["@text"].Value = "A string value";
        cmd.ExecuteNonQuery();
    }
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,
        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Visual Basic 代码示例

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommand
conn.ConnectionString = strConnection
Try
   conn.Open()
   cmd.Connection = conn
   cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)"
   cmd.Prepare()
   cmd.Parameters.AddWithValue("@number", 1)
   cmd.Parameters.AddWithValue("@text", "One")
   For i = 1 To 1000
       cmd.Parameters("@number").Value = i
       cmd.Parameters("@text").Value = "A string value"
       cmd.ExecuteNonQuery()
     Next
Catch ex As MySqlException
    MessageBox.Show("Error " & ex.Number & " has occurred: " & 
    ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try