准备好的语句可以为多次执行的查询提供显着的性能改进。对于多次执行的语句,准备执行比直接执行更快,主要是因为查询只被解析一次。在直接执行的情况下,每次执行都会解析查询。此外,准备执行可以减少网络流量,因为对于准备语句的每次执行,只需要发送参数数据即可。
准备语句的另一个优点是,在启用服务器端准备语句的情况下,它使用二进制协议,使客户端和服务器之间的数据传输更加高效。
要准备语句,请使用以下步骤序列:
创建一个
MySqlCommand
对象并将CommandText
属性设置为您的查询。输入语句后,调用
Prepare
命令对象的方法。准备好语句后,为查询中的每个动态元素添加参数。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