OleDbParameters和参数名称

我有一个SQL语句,我正在通过OleDb执行,语句是这样的:

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

我正在向OleDbCommand添加参数,如下所示:

 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); 

我得到的问题是,如果我添加参数以反过来命令,那么列将填充错误的值(即名称在dept列中,反之亦然)

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

我的问题是,如果参数值只是按照添加命令的顺序插入到表中,参数名称的重点是什么? 参数名称似乎多余?

参数NAMES在SQL支持系统中是通用的(即不是OleDb特定的)。 几乎只有OleDb / Odbc不使用它们。 它们在那里因为OleDb是通用基类的特定实现。

问题是OleDb(和Odbc)也不支持命名参数。
它只支持所谓的位置参数。

换句话说:将参数添加到命令参数列表时给出参数的名称无关紧要。 它仅在OleDbCommand类内部使用,因此它可以区分和引用参数。

重要的是将参数添加到列表的顺序。 它必须与通过问号字符(?)在SQL语句中引用参数的顺序相同。

但是这里有一个允许您在SQL语句中使用命名参数的解决方案。
它基本上用问号替换SQL语句中的所有参数引用,并相应地重新排序参数列表。 对于OdbcCommand类,它的工作方式相同,只需要在代码中将“OleDb”替换为“Odbc”即可。

使用这样的代码:

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

这是代码

 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()); } }