OleDbParameters y nombres de parámetros

Tengo una statement de SQL que estoy ejecutando a través de OleDb, la statement es algo como esto:

INSERT INTO mytable (name, dept) VALUES (@name, @dept); 

Estoy agregando parámetros al OleDbCommand así:

 OleDbCommand Command = new OleDbCommand(); Command.Connection = Connection; OleDbParameter Parameter1 = new OleDbParameter(); Parameter1.OleDbType = OleDbType.VarChar; Parameter1.ParamterName = "@name"; Parameter1.Value = "Bob"; OleDbParameter Parameter2 = new OleDbParameter(); Parameter2.OleDbType = OleDbType.VarChar; Parameter2.ParamterName = "@dept"; Parameter2.Value = "ADept"; Command.Parameters.Add(Parameter1); Command.Parameters.Add(Parameter2); 

El problema que tengo es que si agrego los parámetros al comando al revés, las columnas se rellenan con los valores incorrectos (es decir, el nombre está en la columna de departamento y viceversa)

 Command.Parameters.Add(Parameter2); Command.Parameters.Add(Parameter1); 

Mi pregunta es, ¿cuál es el sentido de los nombres de los parámetros si los valores de los parámetros se insertan en la tabla en el orden en que se agregan? Los nombres de los parámetros parecen redundantes?

Cualquier ayuda apreciada, gracias, Gareth

Los NOMBRES de parámetros son generics en el sistema de soporte de SQL (es decir, no son específicos de OleDb). Casi SOLO OleDb / Odbc NO los use. Están ahí porque OleDb es una implementación específica de las clases base genéricas.

El problema es que OleDb (y Odbc también) no admite parámetros con nombre.
Solo admite lo que se llama parámetros posicionales.

En otras palabras: el nombre que le da a un parámetro cuando lo agrega a la lista de parámetros de comandos no importa. Solo se usa internamente por la clase OleDbCommand para que pueda distinguir y hacer referencia a los parámetros.

Lo que importa es el orden en el que agrega los parámetros a la lista. Debe ser el mismo orden en que se hace referencia a los parámetros en la statement de SQL a través del carácter de signo de interrogación (?).

Pero aquí hay una solución que le permite usar parámetros con nombre en la statement de SQL.
Básicamente reemplaza todas las referencias de parámetros en la statement de SQL con signos de interrogación y reordena la lista de parámetros en consecuencia. Funciona de la misma manera para la clase OdbcCommand, solo necesita reemplazar “OleDb” con “Odbc” en el código.

Usa el código así:

 command.CommandText = "SELECT * FROM Contact WHERE FirstName = @FirstName"; command.Parameters.AddWithValue("@FirstName", "Mike"); command.ConvertNamedParametersToPositionalParameters(); 

Y aquí está el código

 public static class OleDbCommandExtensions { public static void ConvertNamedParametersToPositionalParameters(this OleDbCommand command) { //1. Find all occurrences of parameter references in the SQL statement (such as @MyParameter). //2. Find the corresponding parameter in the commands parameters list. //3. Add the found parameter to the newParameters list and replace the parameter reference in the SQL with a question mark (?). //4. Replace the commands parameters list with the newParameters list. var newParameters = new List(); command.CommandText = Regex.Replace(command.CommandText, "(@\\w*)", match => { var parameter = command.Parameters.OfType().FirstOrDefault(a => a.ParameterName == match.Groups[1].Value); if (parameter != null) { var parameterIndex = newParameters.Count; var newParameter = command.CreateParameter(); newParameter.OleDbType = parameter.OleDbType; newParameter.ParameterName = "@parameter" + parameterIndex.ToString(); newParameter.Value = parameter.Value; newParameters.Add(newParameter); } return "?"; }); command.Parameters.Clear(); command.Parameters.AddRange(newParameters.ToArray()); } }