首页 > 解决方案 > Prepare() 方法的正确位置是什么?在定义参数(及其类型和大小)之前还是之后?

问题描述

我发现了两种不同的描述,说明何时应使用准备好的 SQL 语句的 Prepare() 方法。

在 SqlCommand 的文档中(https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.prepare?redirectedfrom=MSDN&view=netframework-4.7.2#System_Data_SqlClient_SqlCommand_Prepare

“在调用 Prepare 之前,请在要准备的语句中指定每个参数的数据类型。对于每个具有可变长度数据类型的参数,必须将 Size 属性设置为所需的最大大小。如果出现这些情况,Prepare 会返回错误不满足。”

在 MySqlCommand 的文档中(https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html):

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

这两个文件是否相互排斥?究竟应该在哪里使用 Prepare()?在定义参数的数据和类型之后使用 Prepare() 似乎更合乎逻辑。

var conn = new MySql.Data.MySqlClient.MySqlConnection();
var cmd = new MySql.Data.MySqlClient.MySqlCommand();

conn.ConnectionString = strConnection;

conn.Open();
cmd.Connection = conn;

cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)";

cmd.Prepare(); // should it be here?

cmd.Parameters.AddWithValue("@number", 1);
cmd.Parameters.AddWithValue("@text", "One");

cmd.Prepare(); // or here?

for (int i=1; i <= 1000; i++)
{
    cmd.Parameters["@number"].Value = i;
    cmd.Parameters["@text"].Value = "A string value";

    cmd.ExecuteNonQuery();
}

或者也许我不应该比较这两个文档,并且 MySqlCommand 根据 MySql 的 dosc 使用它,而 SqlCommand 根据 Microsoft 的文档使用它?

标签: c#prepared-statementmysql-connector

解决方案


推荐阅读