Saya tahu ini adalah pertanyaan lama, tetapi belum dijawab dengan benar, jadi saya menjawabnya untuk orang lain yang mungkin mengalami masalah ini.
Secara default, ODP.net Oracle mengikat variabel berdasarkan posisi, dan memperlakukan setiap posisi sebagai variabel baru.
Memperlakukan setiap salinan sebagai variabel yang berbeda dan menyetel nilainya beberapa kali adalah solusi dan menyusahkan, seperti yang disebutkan furman87, dan dapat menyebabkan bug, jika Anda mencoba menulis ulang kueri dan memindahkan berbagai hal.
Cara yang benar adalah dengan menyetel properti BindByName dari OracleCommand menjadi true seperti di bawah ini:
var cmd = new OracleCommand(cmdtxt, conn);
cmd.BindByName = true;
Anda juga bisa membuat kelas baru untuk mengenkapsulasi OracleCommand yang mengatur BindByName menjadi true saat instantiasi, jadi Anda tidak perlu menyetel nilainya setiap kali. Ini dibahas dalam posting ini