Mặc dù bạn đang sử dụng tên cho các thông số của mình, trình điều khiển của bạn đang xử lý chúng theo vị trí. Bạn có thể biết vì nó (gần như) khớp với :1
với tên p_cr1
- '1' không phải là tên hợp lệ. Nó không phàn nàn vì nó khớp theo vị trí - nhưng điều đó có nghĩa là nó đang cố gắng sử dụng P_para
cho :1
và vì loại sai, điều đó giải thích lỗi bạn thấy.
Có thể có một cách để thay đổi hành vi của trình điều khiển, nhưng hiện tại bạn chỉ có thể hoán đổi thứ tự mà bạn ràng buộc chúng - vì vậy các liên kết xảy ra theo cùng một thứ tự (vị trí) mà các biến xuất hiện trong truy vấn. Vì vậy:
cmd.Parameters.Add("p_cr1", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);
cmd.Parameters.Add(new OracleParameter(":P_para", OracleDbType.Int64)).Value = Convert.ToInt64(Textbox.Text);
cmd.Parameters.Add("p_cr2", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);