2011-09-09 10 views
6

enter image description hereQuery vấn đề - hàng được trả về khi truy vấn được chạy trong navigator sql, nhưng không phải trong # chương trình c của tôi

Cập nhật:

Đây là truy vấn từ debugger, được lấy ra từ một người thợ xây chuỗi:

{SELECT * FROM FCR.V_REPORT WHERE DATE BETWEEN to_date('14/09/2001' , 'dd/mm/yyyy') AND to_date('30/09/2011' , 'dd/mm/yyyy')} 

Nếu bạn loại bỏ dấu ngoặc nhọn và đăng nó trong Navigator, nó hoạt động.

Gốc:

Tôi gặp sự cố khi chạy chương trình của mình. Truy vấn trong sql navigator trả về 192 hàng nhưng khi tôi chạy truy vấn trên C# (visual studio 2010), truy vấn trả về 0 hàng. Dưới đây là C# mã của tôi:

public static DataTable GetReport(string date1, string date2) 
{ 
    DatabaseAdapter dba = DatabaseAdapter.GetInstance(); 
    string SqlQuery = 
    string.Format(@"SELECT * 
        FROM FCR.V_REPORT 
        WHERE DATE BETWEEN to_date('{0}' , 'dd/mm/yyyy') 
        AND to_date('{1}' , 'dd/mm/yyyy')", date1, date2); 
    OracleDataReader reader = dba.QueryDatabase(SqlQuery); 
    DataTable dt = new DataTable(); 
    dt.Load(reader); 
    int temp = dt.Rows.Count; 
    return dt; 
} 

Đây là câu hỏi tôi đang sử dụng trong sql navigator (trong đó trả 192 dòng):

SELECT * 
FROM FCR.V_REPORT 
WHERE DATE BETWEEN to_date('01/01/2001' , 'dd/mm/yyyy') 
AND to_date('30/09/2011' , 'dd/mm/yyyy') 
+1

bạn có thể dán giá trị thực của 'SqlQuery' (ý tôi là, bạn có thể vượt qua kết quả của lệnh' string.Format') không? –

+1

@Steve B ..i chỉ cần chỉnh sửa với kết quả – mikespiteri

+1

SqlQuery là null ... nhận được nó *** sau *** cuộc gọi của string.Format, và xin vui lòng, gửi giá trị của biến, không phải là một ảnh chụp màn hình của trình gỡ rối. –

Trả lời

2

Hãy thử thả xem và tạo ra một lần nữa. Đảm bảo rằng bạn cũng đã nhận được bí danh.

5

Tôi cá với bạn rằng những ngày trôi qua từ # chương trình c của bạn khác nhau bởi vì câu lệnh sql của bạn giống hệt nhau. Đặt điểm ngắt và xác minh rằng ngày chính xác giống nhau. Đồng thời xác minh rằng date1 và date2 được truyền theo thứ tự thích hợp.

+2

Tôi đã kiểm tra và kiểm tra lại ngày tháng. Đó là lý do tại sao tôi đã đăng ở đây vì nó khá lạ. Tôi đã làm một breakpoint trong chương trình của tôi để kiểm tra nếu số hàng tăng nhưng nó vẫn còn 0 – mikespiteri

1

Khi giải quyết loại sự cố này, tốt nhất là không nên tạo quá nhiều giả định liên quan đến nơi xuất phát lỗi. Nếu bạn có quyền truy cập vào hộp, tôi sẽ chạy một dấu vết và đảm bảo rằng các câu lệnh đang chạy thực sự giống hệt nhau. Nếu chúng giống nhau thì bạn biết bạn có lỗi lập trình ở phía nhận hoặc xử lý của ứng dụng của bạn.

Bạn có thể sửa đổi câu lệnh để chèn kết quả vào bảng tạm thời và xác minh rằng 192 hàng bạn mong đợi có ở đó. Nếu bạn đang thực hiện cùng một câu lệnh chính xác và bảng tạm thời cho thấy rằng bạn đang nhận được kết quả bạn mong đợi, bạn đã thu hẹp thêm vấn đề và có thể bắt đầu tìm kiếm các lỗi ứng dụng.

1

Giả sử rằng mã C# của bạn đang gửi truy vấn chính xác đến cơ sở dữ liệu, có một số cách để Oracle chạy cùng một truy vấn tùy thuộc vào phiên. Bạn có thể cần phải có được một DBA liên quan đến con số này ra (ví dụ bằng cách nhìn vào tuyên bố thực hiện thực tế trong v $ sql), hoặc ít nhất là để loại trừ các trường hợp lạ.

NLS_DATE_FORMAT

Nếu cột NGÀY được lưu giữ như một chuỗi, sẽ có một sự chuyển đổi ngầm để một ngày. Nếu SQL Navigator sử dụng NLS_DATE_FORMAT khác với C# thì chuyển đổi có thể tạo các ngày khác nhau. Mặc dù nếu chúng khác nhau thì có khả năng bạn sẽ gặp lỗi, không chỉ 0 hàng.

Virtual Private Database

VPD có thể thêm một vị mọi thắc mắc, có thể sử dụng thông tin phiên khác nhau. Ví dụ: nếu chương trình đã tạo phiên giống như '% Navigator%', nó có thể thêm 'where 1 = 0' vào mọi truy vấn. (Tôi biết điều này nghe có vẻ điên rồ, nhưng tôi đã nhìn thấy một cái gì đó rất giống nhau.)

Advanced Query Rewrite

này có nghĩa là cho các quan điểm hiện thực. Nhưng một số người sử dụng nó để sửa lỗi hiệu suất, loại giống như phác thảo được lưu trữ. Và một số người xấu sử dụng nó để viết lại truy vấn của bạn vào một truy vấn hoàn toàn khác. Các cài đặt phiên khác nhau, chẳng hạn như QUERY_REWRITE_INTEGRITY và CURSOR_SHARING, có thể giải thích tại sao truy vấn hoạt động trên một phiên nhưng không phải một truy vấn khác. Nói về CURSOR_SHARING, điều đó có thể dẫn đến một số vấn đề hiếm gặp nếu nó được đặt thành SIMILAR hoặc FORCE.

1

Tôi đã gặp tình huống tương tự khá thường xuyên với các công cụ phát triển khác và SQL Server. Trong trường hợp của tôi, tôi thấy rằng trong công cụ truy vấn, tôi sẽ có hai kết quả đầu ra, các bản ghi trong một dữ liệu và thông báo 'hàng bị ảnh hưởng' trong ngăn kết quả. Tuy nhiên, trong IDE phát triển của tôi, tôi sẽ không thấy dữ liệu (trừ khi tôi kiểm tra các tập dữ liệu bổ sung). Đối với một số lý do nó sẽ trả về các hàng bị ảnh hưởng như tập kết quả đầu tiên. Khi tôi tắt tùy chọn rowcount trong chính truy vấn, thì dữ liệu xuất hiện ở cả hai nơi.

Bạn cũng có thể sử dụng trình phân tích giao thức (ví dụ: Ethereal) và nắm bắt lưu lượng truy cập TCP/IP để xác minh rằng các yêu cầu giống hệt nhau qua dây. Điều đó đã giúp tôi trong một pinch quá.

Chúc bạn may mắn.

jl

1

Tôi tự hỏi đây cũng là vấn đề tương tự như câu hỏi của bạn here.

Chuỗi của bạn.Định dạng cuộc gọi không chỉ định định dạng của giá trị ngày1 và ngày 2 trong chuỗi SQL. Do đó, nó đang sử dụng DateTime.ToString() của date1 và date2 mặc định, có thể giống như '16/09/2011 12:23:34 'và do đó không khớp với định dạng được chỉ định trong câu lệnh to_date của bạn.

Hãy thử điều này:

string SqlQuery = string.Format(@"SELECT * FROM V_REPORT WHERE DATE BETWEEN 
            to_date('{0:dd/MM/yyyy}' , 'dd/mm/yyyy') 
            AND 
            to_date('{1:dd/MM/yyyy}' , 'dd/mm/yyyy')", 
            date1, 
            date2);  
+0

cảm ơn tất cả mọi người đã giúp đỡ của bạn. Tôi giải quyết vấn đề. Tôi không chắc chắn những gì đã sai nhưng tôi đã bỏ bảng xem và tạo lại nó và nó đã hoạt động. Tôi vẫn không biết chuyện gì đang xảy ra khiến mọi thứ có vẻ ổn. Cảm ơn một lần nữa – mikespiteri

Các vấn đề liên quan