Оператор переключения быстрее для выполнения, чем if-else-if лестничная структура. Это происходит из-за способности компилятора оптимизировать оператор переключения. В случае if-else-if лестничной структуры код должен обработать каждого если оператор в порядке, определенном программистом. Однако, потому что каждый случай в операторе переключения не полагается на более ранние случаи, компилятор в состоянии переупорядочить тестирование таким способом как для обеспечения самого быстрого выполнения.
Провайдер ODP.Net от oracle по умолчанию использует привязку по позиции. Для изменения поведения привязать по имени. Установите для свойства BindByName значение true. Тогда вы можете отказаться от двойного определения параметров.
using(OracleCommand cmd = con.CreateCommand()) {
...
cmd.BindByName = true;
...
}
Это кажется глупым, но я думаю, что когда вы дважды используете одну и ту же переменную связывания, вам нужно устанавливать ее дважды:
cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
cmd.Parameters.Add("VarC", "1234");
Конечно, это верно для Native Dynamic SQL в PL / SQL:
SQL> begin
2 execute immediate 'select * from emp where ename=:name and ename=:name'
3 using 'KING';
4 end;
5 /
begin
*
ERROR at line 1:
ORA-01008: not all variables bound
SQL> begin
2 execute immediate 'select * from emp where ename=:name and ename=:name'
3 using 'KING', 'KING';
4 end;
5 /
PL/SQL procedure successfully completed.