Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MSSQL vs TADOQuery / 12 сообщений из 12, страница 1 из 1
12.09.2017, 13:54:40
    #39519860
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Всем доброго времени суток, давно работаю с базами MSSQL через компонент TADOQuery в Delphi, но вот незадача, сегодня собрал такой запрос, который благополучно работает в Managment Studio MSSQL, а вот через АДО почему-то не завелся.

Managment Studio:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 
DATEPART(YEAR,[DTime])  AS [Год],
DATEPART(MONTH,[DTime]) AS [Месяц],
DATEPART(DAY,[DTime])   AS [День],
DATEPART(HOUR,[DTime])  AS [Час],
Round(Avg([T1]),0)      AS [V1]
FROM [XControl].[dbo].[TableX]
GROUP BY DATEPART(YEAR,[DTime]), DATEPART(MONTH,[DTime]),
	 DATEPART(DAY,[DTime]),  DATEPART(HOUR,[DTime])
ORDER BY DATEPART(YEAR,[DTime]), DATEPART(MONTH,[DTime]),
	 DATEPART(DAY,[DTime]),  DATEPART(HOUR,[DTime])


Delphi:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
qry1.SQL.Clear;
qry1.SQL.Add('SELECT');
qry1.SQL.Add('DATEPART(YEAR, [DTime]) AS [Год],');
qry1.SQL.Add('DATEPART(MONTH,[DTime]) AS [Месяц],');
qry1.SQL.Add('DATEPART(DAY,  [DTime]) AS [День],');
qry1.SQL.Add('DATEPART(HOUR, [DTime]) AS [Час],');
qry1.SQL.Add('Round(Avg([T1]),0)      AS [V1]');
qry1.SQL.Add('FROM [XControl].[dbo].[TableX]');
qry1.SQL.Add('GROUP BY DATEPART(YEAR,[DTime]), DATEPART(MONTH,[DTime]),');
qry1.SQL.Add('         DATEPART(DAY, [DTime]), DATEPART(HOUR, [DTime])');
qry1.SQL.Add('ORDER BY DATEPART(YEAR,[DTime]), DATEPART(MONTH,[DTime]),');
qry1.SQL.Add('         DATEPART(DAY, [DTime]), DATEPART(HOUR, [DTime])');
qry1.Open;



Текст здесь выровнял, для удобочитаемости.

Ошибку такую говорит: qry1: Field 'DTime' not found
Поставщик данных "Provider=SQLOLEDB.1".
Я так понимаю построение запроса отличается.
...
Рейтинг: 0 / 0
12.09.2017, 14:04:05
    #39519870
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Попробуй в кавычки имя поля заключить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.09.2017, 14:07:16
    #39519875
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Может ADO зачем-то нужно это поле в части Select?
Попробуй ради эксперимента добавь qry1.SQL.Add('DTime,')
...
Рейтинг: 0 / 0
12.09.2017, 14:37:33
    #39519900
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Вот запрос, который прекрасно работает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
qry1.SQL.Clear;
    qry1.SQL.Add('SELECT');
    qry1.SQL.Add('[DTime],T1,[T2],[T3],[T4]');
    qry1.SQL.Add('FROM');
    qry1.SQL.Add('[XControl].[dbo].[TableX]');
    qry1.SQL.Add('WHERE [DTime] BETWEEN :dt1 AND :dt2');
    qry1.SQL.Add('ORDER BY [DTime]');
    qry1.Parameters.ParseSQL(qry1.SQL.Text, True);
    qry1.Parameters.ParamByName('dt1').Value := dtp1.DateTime;
    qry1.Parameters.ParamByName('dt2').Value := dtp2.DateTime;
    qry1.Open;



но там данные все, что есть в выбранном периоде.
А в запросе, что в топике, данные усредняются кратно часу (Условие выбора периода пока-что убрал).

Если ставить кавычки, получаем:
First chance exception at $73F0B802. Exception class EOleException with message 'Ошибка преобразования даты или времени из символьной строки'. Process XCChart.exe (9584)

Если добавить поле "DTime" то выходит:
First chance exception at $73F0B802. Exception class EOleException with message 'Столбец "XControl.dbo.TableX.DTime" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY'. Process XCChart.exe (4784)
...
Рейтинг: 0 / 0
12.09.2017, 14:58:05
    #39519919
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
kokon_01> А в запросе,

Проверь на всякий случай текст запроса перед
Open (и попробуй выполнить его в SSMS).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.09.2017, 15:48:41
    #39519947
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
kokon_01Если добавить поле "DTime" то выходит:
First chance exception at $73F0B802. Exception class EOleException with message 'Столбец "XControl.dbo.TableX.DTime" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY'. Process XCChart.exe (4784)Ну вообще логично. Ступил. Его ж ты на кусочки делишь для агрегации.
Может пропробовать альяс таблице сделать и добавлять его к именам полей? Типа X.DTime
...
Рейтинг: 0 / 0
12.09.2017, 16:07:34
    #39519958
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Оказалась проблема совсем в другом. На форме есть "DBChart", для рисования графика, так вот в нём привязаны значения к полям по запросу с "чистыми данными" из БД. Вот он и хотел как оказалось поле "DTime", которого соответственно нет, во втором варианте запроса с алиасами и усреднением. В заблуждение ввело то, что данные совсем не попадали в DataSource, думал ну неправильные поля, так хоть DBGrid отобразил бы наличие данных, ан нет...
...
Рейтинг: 0 / 0
12.09.2017, 16:14:07
    #39519960
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
kokon_01> В заблуждение ввело то, что

... не проверил текст запроса в SSMS, о чём я и говорил выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.09.2017, 16:23:02
    #39519971
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Дак в самом начале писал, что там его и создал изначально, потом перенес в делфи и вписал в "qry1.SQL.Add();"
...
Рейтинг: 0 / 0
12.09.2017, 16:26:34
    #39519973
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
Интересно что отслеживал через SQL Server Profiler, все события в данной БД, так туда запрос приходил в нормальном состоянии, а в DataSource набор данных не возвращался. Видимо из-за ошибки возникающей в DBChart.
...
Рейтинг: 0 / 0
12.09.2017, 17:37:03
    #39520018
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
kokon_01> так туда запрос приходил в нормальном состоянии

Ну, значит, не ADO был виноват.

> а в DataSource набор данных не возвращался.
> Видимо из-за ошибки возникающей в DBChart.

С чего это в DataSource набор данных не попадал?
Просто у тебя там события намешаны, наверное.

Вообще, первое, что нужно делать при возникновении
"сложной" проблемы/ошибки (которую не можешь с ходу
решить и тем более понять причины) - локализовать её.
И лучший способ сделать это - в чистом проекте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 06:43:14
    #39520171
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL vs TADOQuery
В MSSQL можно пользоваться профайлером (Profiler). Видно, приходит ли запрос на сервер.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MSSQL vs TADOQuery / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]