OraOLEDB.Oracle провайдер возвращает неверные результаты

Вот странный для вас. Я запускаю простой запрос к таблице, которая выглядит следующим образом:

select expiration_date from Tbl where expiration_date > sysdate - 1

В SQL Developer это возвращает 35 строк. Приложение VB.NET, вызывающее точно такой же оператор SQL, используя OraOLEDB.Oracle провайдер возвращает только 30 строк.

Вот моя строка подключения (разбита на разборчивость):

Provider=OraOLEDB.Oracle;
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)
(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xe)));
User Id=rps;
Password=*******;
OLEDB.NET=True;

А вот пример кода (мы в ProcessRequest раздел универсального обработчика ASHX):

Dim conn As OleDbConnection = New OleDbConnection(ConfigurationManager.AppSettings("ConnectionString"))
conn.Open()
Dim cmd As OleDbCommand = conn.CreateCommand()
Dim sql As String = "select expiration_date from Tbl where expiration_date > sysdate - 1"
cmd.CommandText = sql
Dim reader As OleDbDataReader = cmd.ExecuteReader()
context.Response.ContentType = "text/plain"
context.Response.Write("RESULTS: " & vbCrLf)
Dim i As Int32 = 1
While reader.Read()
    context.Response.Write(i.ToString() & ". " & reader.GetValue(0).ToString() & vbCrLf)
    i = i + 1
End While

reader.Close()
cmd.Dispose()
conn.Close()
conn.Dispose()

Если я изменю запрос, чтобы сказать ... where expiration_date < sysdate + 15 это работает отлично.

Что на земле происходит? Это ODAC 11.2.0.3, если это помогает.


Обновление 1: я удалил ODAC 11.2.0.3 и обновил до ODAC 12.1.0.1 (ORAOLEDB12.DLL). Поведение без изменений.


Обновление 2: ну это интересно. Я переключился на ODP.NET, чтобы посмотреть, что произойдет. Угадай, что? ЖЕ ТОЧНЫЕ РЕЗУЛЬТАТЫ. Я даже больше не могу винить провайдера. Мне нужно выпить.


Обновление 3: наконец-то появилась блестящая идея увидеть, какие даты были исключены. Есть пять expiration_dates, которые происходят в ноябре месяце после сегодняшнего дня, которые должны быть включены в результаты. Это именно те, которые исключены. Таким образом, sysdate-1 не делает то, что вы ожидаете, когда вызывается из C#. Время для другого напитка.

1 ответ

Решение

Я идиот. Oracle SQL Developer выполняет все в транзакции, а я не был COMMITчто угодно. Я опускаю голову от стыда и могу только надеяться, что это послужит предупреждением для других.

Другие вопросы по тегам