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