Jag vet att detta är en gammal fråga, men den har inte åtgärdats korrekt, så jag svarar på den för andra som kan stöta på det här problemet.
Som standard binder Oracles ODP.net variabler efter position och behandlar varje position som en ny variabel.
Att behandla varje kopia som en annan variabel och ställa in dess värde flera gånger är en lösning och en smärta, som furman87 nämnde, och kan leda till buggar om du försöker skriva om frågan och flytta runt saker.
Det korrekta sättet är att ställa in BindByName-egenskapen för OracleCommand till true enligt nedan:
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Du kan också skapa en ny klass för att kapsla in OracleCommand genom att ställa in BindByName till true vid instansiering, så att du inte behöver ställa in värdet varje gång. Detta diskuteras i det här inlägget