Tôi hiện đang sử dụng nhà cung cấp ADO.NET của Microsoft cho Oracle (System.Data.OracleClient
). Tôi biết rằng nó chắc chắn không phải là nhà cung cấp Oracle tốt nhất có sẵn và rằng nó will soon be deprecated, tôi nên sử dụng ODP.NET của Oracle để thay thế. Lý do tại sao tôi vẫn sử dụng nhà cung cấp MS là vì ODP.NET liên kết các thông số theo vị trí, không theo tên. Điều này thực sự có thể là một PITA khi bạn sử dụng nhiều tham số trong một truy vấn, bởi vì bạn phải cẩn thận để thêm chúng vào đúng thứ tự, mà có thể dễ dàng dẫn đến lỗi. Nó cũng gây phiền nhiễu khi bạn sử dụng các thông số tương tự nhiều lần trong cùng một truy vấn, ví dụ:Tham số truy vấn ràng buộc theo tên với ODP.NET
SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
Với ODP.NET, tôi phải thêm hai tham số cho các OracleCommand
, mà tôi nghĩ là ngu ngốc ...
ODP.NET OracleCommand
có thuộc tính để thay đổi hành vi mặc định đó: BindByName
. Khi được đặt thành true, các tham số bị ràng buộc bởi tên, đó là những gì tôi muốn. Đáng tiếc là điều này không thực sự giúp tôi, bởi vì:
- Nó được thiết lập để sai theo mặc định
- Tôi gần như không bao giờ sử dụng các lớp ADO.NET bê tông một cách rõ ràng, tôi thích sử dụng ADO.NET 2.0 lớp trừu tượng (
DbProviderFactory
,DbConnection
,DbCommand
...) để giảm liên kết với bất kỳ RDBMS cụ thể nào. Vì vậy, tôi không có quyền truy cập vào thuộc tínhBindByName
, trừ khi tôi truyền rõ ràng đếnOracleCommand
, mất tất cả lợi ích hoặc sự trừu tượng. - Khi sử dụng ASP.NET SqlDataSource, tôi không tự tạo DbCommand, vì vậy tôi không có cơ hội để đặt
BindByName
thành true (tôi có thể thực hiện trong sự kiện Chọn, nhưng thực sự là một nỗi đau hãy làm điều đó cho mỗi SqlDataSource ...)
Tôi phải xử lý vấn đề đó như thế nào? Có cài đặt BindByNameByDefault
ở đâu đó không? (Tôi đã không tìm thấy bất cứ điều gì như thế, nhưng tôi có thể đã bỏ lỡ nó ...)
Tôi chỉ lãng phí 3 giờ vì "tính năng" này! – Grzenio