Gaz*_*Gaz 10 .net c# oledb oledbparameter oledbcommand
我有一个SQL语句,我正在通过OleDb执行,语句是这样的:
INSERT INTO mytable (name, dept) VALUES (@name, @dept);
Run Code Online (Sandbox Code Playgroud)
我正在向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);
Run Code Online (Sandbox Code Playgroud)
我得到的问题是,如果我添加参数以反过来命令,那么列将填充错误的值(即名称在dept列中,反之亦然)
Command.Parameters.Add(Parameter2);
Command.Parameters.Add(Parameter1);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果参数值只是按照添加命令的顺序插入到表中,参数名称的重点是什么?参数名称似乎多余?
Dav*_*err 12
问题是OleDb(和Odbc)也不支持命名参数.
它只支持所谓的位置参数.
换句话说:将参数添加到命令参数列表时给出参数的名称无关紧要.它仅在OleDbCommand类内部使用,因此它可以区分和引用参数.
重要的是将参数添加到列表的顺序.它必须与通过问号字符(?)在SQL语句中引用参数的顺序相同.
但是这里有一个允许您在SQL语句中使用命名参数的解决方案.
它基本上用问号替换SQL语句中的所有参数引用,并相应地重新排序参数列表.对于OdbcCommand类,它的工作方式相同,只需要在代码中将"OleDb"替换为"Odbc"即可.
使用这样的代码:
command.CommandText = "SELECT * FROM Contact WHERE FirstName = @FirstName";
command.Parameters.AddWithValue("@FirstName", "Mike");
command.ConvertNamedParametersToPositionalParameters();
Run Code Online (Sandbox Code Playgroud)
这是代码
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<OleDbParameter>();
command.CommandText = Regex.Replace(command.CommandText, "(@\\w*)", match =>
{
var parameter = command.Parameters.OfType<OleDbParameter>().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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9967 次 |
| 最近记录: |