Неверно работает Прямой запрос к MS SQL с ADODB
Всем привет! Есть такой код. Он делает запрос из MSSQL.
Но запрос возвращает только некоторые данные из таблицы, например в колонке Дата, Долгота, Широта данные есть, а mobagentid полностью выдает Неопределено. А Иногда и Долгота может стать Неопределено. а остальные данные выходят. Этот же запрос выполняю через Management Studio, он прекрасно отрабатывает и все данные выводятся. В чем может быть причина? Никак не могу понять. Где я что делаю не так?
/////////////////////////////////////////
//Подключение к SQL-серверу
Попытка
Соединение = Новый COMОбъект("ADODB.Connection");
Команда = Новый COMОбъект("ADODB.Command");
Выборка = Новый COMОбъект("ADODB.RecordSet");
Соединение.ConnectionString =
"driver={SQL Server};" +
"server="+ИмяСервераSQL+";"+
"uid="+ПользовательSQL+";"+
"pwd="+ПарольSQL+";"+
"database="+БазаДанныхSQL+";";
Соединение.ConnectionTimeout = 30;
Соединение.CommandTimeout = 1200;
//Открытие соединение
Соединение.Open();
Команда.ActiveConnection = Соединение;
Сообщить ("Успешное подключение!");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ТекДата = ТекущаяДата();
///////////////////////////////////////
//Читаем записи
ТекстИнструкции = "SEL ECT agents.Name as agentName, location.MobAgentID as agentID, location.Date, location.Latitude as latitude, location.Longitude as longitude
|Fr om
|( Sel ect dbo.MobAgent.Name, temp1.MobAgentID
| fr om dbo.MobAgent LEFT JOIN (SEL ECT DISTINCT MobAgentID FR OM dbo.Location) AS temp1 ON dbo.MobAgent.Id = temp1.MobAgentID
|) AS agents
|
|inner JOIN
|(
|Select MAX(location.Date) as adate, location.MobAgentID as MobAgentID fr om dbo.Location as location wh ere location.Date between DATEadd(DAY,-1, GETDATE()) and '"+Формат(КонецДня(ТекДата), "ДФ=dd/MM/yyyy")+" "+Формат(КонецДня(ТекДата), "ДЛФ=T") +"' group by location.MobAgentID) MaxDates on agents.MobAgentID = maxDates.MobAgentID inner JOIN
|(select * fr om dbo.Location as location wh ere location.Date between DATEadd(DAY,-1, GETDATE()) and '" +Формат(КонецДня(ТекДата), "ДФ=dd/MM/yyyy")+" "+Формат(КонецДня(ТекДата), "ДЛФ=T") + "') location on maxDates.adate = location.Date and maxDates.MobAgentID = location.MobAgentID";
Попытка
Команда.CommandText = ТекстИнструкции;
Выборка = Команда.Execute();
Если Выборка.BOF = Ложь Тогда
Выборка.MoveFirst();
Пока Выборка.EOF = Ложь Цикл
НовСтр=ТаблТекущиеКоординаты.Добавить();
НовСтр.ДатаВремя = Дата(Выборка.Fields("date").Value);
НовСтр.Долгота = Число(Выборка.Fields("longitude").Value);
НовСтр.Широта = Число(Выборка.Fields("latitude").Value);
НовСтр.Агент = Строка((Выборка.Fields("agentName").Value));
НовСтр.Источник = "CP";
НовСтр.Скорость = 10;
Сообщить(НовСтр.Долгота + " " + НовСтр.Широта);
Выборка.MoveNext();
КонецЦикла;
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
/////////////////////////////////////////
//Закрытие соединения
Попытка
Соединение.Close();
Сообщить("Соединение закрыто!");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ПоказатьНо запрос возвращает только некоторые данные из таблицы, например в колонке Дата, Долгота, Широта данные есть, а mobagentid полностью выдает Неопределено. А Иногда и Долгота может стать Неопределено. а остальные данные выходят. Этот же запрос выполняю через Management Studio, он прекрасно отрабатывает и все данные выводятся. В чем может быть причина? Никак не могу понять. Где я что делаю не так?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Почему бы не использовать обобщенные табличные выражения (CTE) в запросе - это почти как временные таблицы, только живут они в рамках одного вызова. Запрос получается нагляднее и понятнее, его проще редактировать.
Вам же нужно просто получить последние координаты за период (например за текущий день):
Вам же нужно просто получить последние координаты за период (например за текущий день):
LocationsOfDay as(
sel ect
MobAgentID,
Date,
Latitude,
Longitude
fr om
dbo.Location
wh ere
Date >= CAST (GETDATE() as DATE)
and Date < DATEADD(DAY, 1, CAST (GETDATE() as DATE))),
MaxDates as(
sel ect
MobAgentID,
MAX(Date) MaxDate
from LocationsOfDay
group by
MobAgentID),
LastLocations as(
select
LocationsOfDay.MobAgentID,
LocationsOfDay.Date,
LocationsOfDay.Latitude,
LocationsOfDay.Longitude
fr om
LocationsOfDay inner join MaxDates
on LocationsOfDay.MobAgentID = MaxDates.MobAgentID
and LocationsOfDay.Date = MaxDates.MaxDate)
select
dbo.MobAgent.Name as agentName,
LastLocations.MobAgentID as agentID,
LastLocations.Date,
LastLocations.Latitude as latitude,
LastLocations.Longitude as longitude
fr om
LastLocations left join dbo.MobAgent on LastLocations.MobAgentID = dbo.MobAgent.ID
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот