2013-06-13 26 views
8

Tôi đang sử dụng EntityFramework với Oracle bằng cách sử dụng odp.net. Truy vấn sql được tham số hóa không hoạt động.Khuôn khổ thực thể với Oracle bằng cách sử dụng odp.net không tham số trong truy vấn LINQ

var orderCode = "XYZ"; 
var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = '{0}'" 
    , orderCode 
); 

(hoặc)

var set1 = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = ':param'", 
    new OracleParameter("param", orderCode) 
); 

Console.WriteLine(set.Count() + ", " + set1.Count()); //Gives 0, 0 

Tuy nhiên, nếu tôi có mã cứng giá trị, nó hoạt động.

var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = 'XYZ'", 
    orderCode 
); 

Có ai biết tại sao không? Tôi có 150 cột trong chế độ xem đó. Đó có phải là vấn đề không?

CẬP NHẬT: Truy vấn có tham số Oracle hoạt động. Vấn đề là tôi đã có dấu nháy đơn xung quanh biến: param.

Điều đó đang được nói, truy vấn hàng đầu với '{0}' không hoạt động. Ngoài ra, truy vấn LINQ sau đây không hoạt động.

var set = ctx.Orders.Where(a => a.OrderCode == orderCode); // Gets zero results. 

Khi tôi mã hóa giá trị, nó hoạt động và tìm nạp kết quả chính xác.

var set = ctx.Orders.Where(a => a.OrderCode == "XYZ"); // Gets the results correctly. 

UPDATE 2: Các truy vấn làm việc với tài xế dotconnect từ Devart. Có vẻ như đây là vấn đề với odp.net.

Bất kỳ ai cũng có vấn đề tương tự?

+0

Bạn có thể giải thích "không hoạt động" tốt hơn không? Bạn có nhận được ngoại lệ, kết quả trống hoặc kết quả sai không? –

+0

Tính năng này có hoạt động nếu bạn sử dụng 'a.OrderCode.Equals (mã đơn hàng)' –

+0

.Equals không hoạt động. – Jonna

Trả lời

1

Không chắc chắn nếu bạn cắt ngắn ví dụ của bạn, nhưng nếu bạn đang sử dụng nhiều tham số, điều này có thể là vấn đề:

Parameterized query in Oracle trouble

Mặc dù tôi không thể nhìn thấy bất cứ điều gì sai trái với ví dụ của bạn, tôi tự hỏi nếu bạn đang bị ảnh hưởng bởi vấn đề BindByName cũ. Theo mặc định, ODP.NET liên kết các tham số với truy vấn theo thứ tự mà chúng được thêm vào bộ sưu tập, thay vì dựa trên tên của chúng như bạn muốn. Hãy thử đặt BindByName thành true trên đối tượng OracleCommand của bạn và xem có khắc phục được sự cố không.

0

Hãy cẩn thận khi sử dụng chuỗi trong kết nối với Oracle vì nó có không minh bạch để chuỗi pad được xác định là CHAR (đọc CHAR versus VARCHAR2 Semantics để biết chi tiết).

Cho phép giả định bạn đã xác định OrderCode như CHAR(4) với một giá trị của XYZ sau đó PL/SQL trống-miếng đệm giá trị độ dài tuyên bố mà kết quả trong XYZ_ (trong khi _ là nhân vật đệm ở đây).

Cũng giả thiết rằng phi liên tục chuỗi orderCode được coi là VARCHAR2 do tuyên bố này trong docs:

Nếu một trong hai giá trị trong một so sánh có datatype VARCHAR2, ngữ nghĩa phi trống-đệm được sử dụng. Tức là, khi so sánh các giá trị ký tự với độ dài không bằng nhau, PL/SQL không điều chỉnh và sử dụng độ dài chính xác.

Bây giờ nếu bạn cố gắng làm một a.OrderCode == orderCode sau đó phía bên trái là CHAR và phía bên phải là VARCHAR2 và do đó non-blank-padding được sử dụng mà kết quả trong XYZ_ = XYZ trở false.

Vì vậy, giải pháp là sử dụng một cái gì đó như a.OrderCode.TrimEnd() == orderCode để thực hiện công việc so sánh như .TrimEnd() được dịch sang hàm PL/SQL RTRIM() trả về một VARCHAR2.