C#MySQL参数:? 要么 @

我对MySQL参数感到困惑。

我的代码的以下两部分都可以正常工作。 第一个使用@参数:

 const string query = "UPDATE `items` SET `name` = @name, `price` = @price WHERE `id` = @id"; try { using (MySqlCommand cmd = new MySqlCommand(query, Database.MyConnection)) { cmd.Parameters.AddWithValue("name", name); cmd.Parameters.AddWithValue("price", price); cmd.Parameters.AddWithValue("id", id); cmd.ExecuteNonQuery(); } } 

第二个使用参数?

 const string query = "UPDATE `items` SET `name` = ?name, `price` = ?price WHERE `id` = ?id"; try { using (MySqlCommand cmd = new MySqlCommand(query, Database.MyConnection)) { cmd.Parameters.AddWithValue("name", name); cmd.Parameters.AddWithValue("price", price); cmd.Parameters.AddWithValue("id", id); cmd.ExecuteNonQuery(); } } 

这些答案都说@? 工作得很好。 甚至cmd.Parameters.AddWithValue("@name", name); 似乎工作(请注意名称中的@ )。

  1. 为什么所有这些都可以正常使用MySQL?

  2. 它们之间有区别吗?

  3. 哪一个是与MySQL一起使用的正确方法?

感谢您提供的任何帮助。

从文档 :

提供程序的早期版本使用“@”符号标记SQL中的参数。 这与MySQL用户变量不兼容,因此提供程序现在使用’?’ 用于在SQL中定位参数的符号。 要支持旧代码,可以在连接字符串上设置“old syntax = yes”。 如果您这样做,请注意,如果您未能定义要在SQL中使用的参数,则不会抛出exception。

看来这又改变了

从更新的文档连接器选项

旧语法,OldSyntax,使用旧语法,UseOldSyntax – Connector / Net 5.2.2中不推荐使用此选项。 现在应该使用’@’符号作为参数标记来编写所有代码。

也来自Creating a Connector .Net

使用参数的’@’符号现在是首选方法,尽管使用’?’的旧模式 仍然受支持。 要在将“@”符号与用户变量结合使用时避免冲突,请参阅第7章“连接器/网络连接字符串选项参考”中的“允许用户变量连接字符串”选项。 现在已弃用旧语法连接字符串选项。

@和? 都是在MySQL中标记参数的符号,你甚至可以像…一样使用它

 command.CommandText = @"UPDATE sellinginventorytable SET cqty=cqty+@aqty,`date`=CURRENT_TIMESTAMP(),`user`=@user WHERE cid=?cid; INSERT INTO internaltranstable SET `type`='INV.ADJ.', `cid`=?cid, `cqty`=@aqty, `date`=CURRENT_TIMESTAMP(), `notes`='STORE INVENTORY ADJUSTMENT', `area`='COUNTER', `sender`=@user, `receiver`=@user;"; command.Parameters.AddWithValue("?cid", row.Cells["barcode"].Value); command.Parameters.AddWithValue("@aqty", row.Cells["aqty"].Value); command.Parameters.AddWithValue("@user", Properties.Settings.Default.user.ToUpper()); command.ExecuteNonQuery(); command.Parameters.Clear();