Знам, че това е стар въпрос, но не е адресиран правилно, така че отговарям на него за други, които може да се сблъскат с този проблем.
По подразбиране ODP.net на Oracle свързва променливи по позиция и третира всяка позиция като нова променлива.
Третирането на всяко копие като различна променлива и задаване на стойността му няколко пъти е заобиколно решение и болка, както спомена furman87, и може да доведе до грешки, ако се опитвате да пренапишете заявката и да преместите нещата.
Правилният начин е да зададете свойството BindByName на OracleCommand на true, както е посочено по-долу:
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Можете също така да създадете нов клас за капсулиране на OracleCommand, като зададете BindByName на true при инстанциране, така че не е нужно да задавате стойността всеки път. Това се обсъжда в тази публикация