.Add vs .AddWithValue



我始终使用.Add方法向ParametersCollection添加参数。最近有人向我指出,在MySql中,.AddWithValue是首选。MySQL积极倡导和推广使用

我接受了这个建议,直到我意识到这个建议是针对一个特定的提供商MySqlConnector的。我通常使用MySql.Data.MySqlClient。我没有找到任何关于此提供程序的.Add与.AddWithValue的推荐信息。

MySql.Data.MySqlClient首选哪个?

据我所知,对于任何数据库系统来说,参数集合上从提供的值的数据类型推断底层数据库数据类型的任何方法都不是首选方法。这对AddWithValue方法和不将显式数据库类型作为参数的参数构造函数都很重要。

对于我所知道的所有数据库系统,有几种情况下没有从对象/值类型到数据库类型的1:1映射。

在创建参数时,显式声明底层数据库数据类型几乎总是更好的。这通常是通过向参数集合的Add方法或参数的构造函数提供合适的枚举值来完成的。

更多信息:AddWithValue是邪恶的| Dan Guzman的博客。(它专注于SQL Server,但也适用于其他各种数据库系统。(

编辑

MySQL参数似乎有点不同:使用AddWithValue-MySqlConnector。因此,目前似乎没有人直接反对将AddWithValue与MySqlConnector一起使用。

个人观点(撰写本文时(

在我看来,MySQL/MySqlConnector中的参数处理有些奇怪。AddWithValue被声明为OK的原因似乎是,无论如何,参数值都是以一种相当直率的方式传递的(例如,将数字转换为字符串(。因此,乍一看,MySQL和/或MySqlConnector命令参数机制似乎没有得到特别好的优化。这可能有优点(如灵活性(和缺点(如性能较差(。

既然我是";凸起";作为SQL Server环境中的开发人员,我显然更喜欢尽可能明确地使用类型声明

我很好奇在MySQL和MySqlConnector中使用AddWithValueAdd之间的性能差异,所以我将进一步研究它如果性能差异很小,我个人更喜欢可维护性而不是性能,并坚持使用显式数据库类型(因此使用Add和采用MySqlDbType枚举值的参数构造函数(。以下是我在这方面看重的一些优势:

  • 我更喜欢有一个坚实、稳定和一致的代码库。在数据访问场景中使用相同的机制是我喜欢的一个例子,因为它简化了阅读和理解我自己的代码(从而简化了代码的维护(
  • 在代码中明确指定底层数据库类型是一种自文档形式。类型推理可能很好,也很简洁,但它也有缺点,所以我总是非常谨慎
  • 如果将来MySQL/MySqlConnector参数类型系统得到优化,代码将立即从性能优势中获益,而无需重新访问和深入重构我的代码库

最新更新