LinkMenuExpand(external link)DocumentSearchCopyCopied

Start Using AddWithValue with MySQL

There’s some advice out there that insists calling cmd.Parameters.AddWithValue “needs to stop”.

That advice may be valid for Microsoft SQL Server, but is inapplicable to MySQL Server. If you use MySQL, you should freely use cmd.Parameters.AddWithValue("@paramName", value);.

The primary reason that AddWithValue is OK to use is that MySQL’s text protocol is not typed in a way that matters for client-side type inference.

All numbers are sent as ASCII digits (e.g., 1234), whether they’re typed as DbType.Int32 or MySqlDbType.NewDecimal, or left untyped and the value is just assigned a long or float or decimal. (Of course, if you’re trying to store a floating point number in an integer column, the server will have to convert/coerce it, but that isn’t affected by the parameter type set in your C# code.)

Similarly, all strings are sent as UTF8-encoded bytes (e.g., 'abcd') regardless of the charset of the column they’re being inserted into (the server will perform a conversion if necessary).

It doesn’t really matter what you set the MySqlParameter.DbType or MySqlParameter.MySqlDbType property values to, so don’t worry about it; just call AddWithValue, let MySqlConnector serialize the type on the wire based on its .NET type, and let MySQL Server perform any conversion that might be necessary.