Проблема запроса - строки возвращаются, когда запрос выполняется в навигаторе sql, но не в моей программе на c # - PullRequest
6 голосов
/ 09 сентября 2011

enter image description here

Обновление:

Это запрос отладчика, который был получен из компоновщика строк:

{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')}

Если удалить фигурныескобки и отправьте его в навигатор, он работает.

Оригинал:

У меня проблема при запуске моей программы.Запрос в sql навигаторе возвращает 192 строки, но когда я запускаю запрос на C # (Visual Studio 2010), запрос возвращает 0 строк.Ниже мой код c #:

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;
}

Это запрос, который я использую в sql навигаторе (который возвращает 192 строки):

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')

Ответы [ 6 ]

5 голосов
/ 09 сентября 2011

Могу поспорить, что даты, переданные из вашей программы на c #, отличаются, потому что ваш SQL-запрос идентичен.Поставьте точку останова и убедитесь, что даты совпадают.Также убедитесь, что date1 и date2 переданы в соответствующем порядке.

2 голосов
/ 16 сентября 2011

Попробуйте сбросить представление и создать заново.Убедитесь, что вы правильно указали псевдонимы.

1 голос
/ 16 сентября 2011

Мне интересно, это та же проблема, что и ваш вопрос здесь .

Ваш вызов string.Format не указывает формат значений date1 и date2 в самой строке SQL. Следовательно, он использует значение DateTime.ToString () по умолчанию для date1 и date2, которое может быть чем-то вроде '16 / 09/2011 12:23:34 'и поэтому не соответствует формату, указанному в вашем операторе to_date.

Попробуйте это:

   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);       
1 голос
/ 16 сентября 2011

Я часто сталкивался с такой же ситуацией с другими инструментами разработки и SQL Server. В моем случае я обнаружил, что в инструменте запросов у меня будет два вывода: записи в сетке данных и сообщение «затронутые строки» в области результатов. Однако в моей среде разработки я не вижу данных (если я не проверил наличие дополнительных наборов данных). По какой-то причине он вернул бы затронутые строки как первый набор результатов. Когда я отключил опцию rowcount в самом запросе, данные появились в обоих местах.

Вы также можете использовать анализатор протоколов (например, Ethereal ) и захватывать трафик TCP / IP, чтобы убедиться, что запросы идентичны по проводам. Это также помогло мне в крайнем случае.

Удачи.

JL

1 голос
/ 16 сентября 2011

Предполагая, что ваш код C # отправляет правильный запрос в базу данных, есть несколько способов для Oracle выполнить один и тот же запрос по-разному в зависимости от сеанса.Вам может потребоваться привлечение администратора базы данных, чтобы выяснить это (например, путем просмотра фактически выполненного оператора в v $ sql) или, по крайней мере, исключить эти странные случаи.

NLS_DATE_FORMAT

Если столбец DATE хранится в виде строки, произойдет неявное преобразование в дату.Если SQL Navigator использует другой NLS_DATE_FORMAT, чем C #, преобразование может создать разные даты.Хотя если бы они были разными, есть большая вероятность, что вы получите ошибку, а не только 0 строк.

Виртуальная частная база данных

VPD можетдобавить предикат к каждому запросу, возможно, используя другую информацию о сеансе.Например, если программа, создавшая сеанс, похожа на «% Navigator%», она может добавить «где 1 = 0» к каждому запросу.(Я знаю, это звучит безумно, но я видел нечто очень похожее.)

Расширенный переписать запрос

Это предназначено для материализованных представлений,Но некоторые люди используют это для исправления производительности, вроде как сохраненные схемы.И некоторые злые люди используют его, чтобы переписать ваш запрос в совершенно другой запрос.Различные настройки сеанса, такие как QUERY_REWRITE_INTEGRITY и CURSOR_SHARING, могут объяснить, почему запрос работает в одном сеансе, а не в другом.Говоря о CURSOR_SHARING, это может привести к редким проблемам, если для него установлено значение SIMILAR или FORCE.

1 голос
/ 16 сентября 2011

При решении этой проблемы обычно лучше не делать слишком много предположений относительно того, откуда возникла ошибка.Если у вас есть доступ к коробке, я бы запустил трассировку и убедился, что выполняемые операторы действительно идентичны.Если они идентичны, то вы знаете, что у вас есть программная ошибка на стороне приема или обработки вашего заявления.

Вы можете изменить свой оператор, чтобы вставить результаты во временную таблицу и убедиться, что там есть ожидаемые 192 строки.Если вы выполняете точно такой же оператор, а временная таблица показывает, что вы получаете ожидаемые результаты, вы еще больше сузили проблему и можете начать поиск ошибок приложения.

...