Неверно работает Прямой запрос к MS SQL с ADODB

1. soulsb 18.05.18 07:30 Сейчас в теме
Всем привет! Есть такой код. Он делает запрос из MSSQL.

/////////////////////////////////////////
    //Подключение к 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, он прекрасно отрабатывает и все данные выводятся. В чем может быть причина? Никак не могу понять. Где я что делаю не так?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user928779 18.05.18 07:54 Сейчас в теме
1) Не присваиваешь значение колонки mobagentig в добавляемую строку таблицы.
2) Глушишь ошибку преобразования типов.

Есть еще тонкий момент с формированием литерала даты, но тебе и первых пунктов зватит.
3. soulsb 18.05.18 07:58 Сейчас в теме
(2)

Вы не так поняли, дальнейшая обработка Выборки это уже другой вопрос, Но в Самой Выборке нет этих значений, прикрепляю скриншот: Внимательно проследите за стрелкой отладки, как там значения пропадают
Прикрепленные файлы:
4. Jimbo 10 18.05.18 09:24 Сейчас в теме
temp1.MobAgentID в левом соединении может быть NULL
7. soulsb 18.05.18 12:31 Сейчас в теме
(4)

Я точно уверен что не может быть в данный момент NULL так как когда этот же запрос тестирую на Management Studio, то запрос обрабатывается верно и все данные выходят
5. SlavaKron 18.05.18 10:56 Сейчас в теме
Почему бы не использовать обобщенные табличные выражения (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
Показать
9. soulsb 18.05.18 12:34 Сейчас в теме
(5)

Как я понял дело не в запросе, так как даже когда я делаю

"sel ect * fr om dbo.v_AgentLocations"

то некоторые поля выходят как Неопределено, хотя там точно есть данные
6. МихаилМ 18.05.18 11:54 Сейчас в теме
где хинты на блокировки. за это надо увольнять.
8. soulsb 18.05.18 12:33 Сейчас в теме
(6)

Можете по-подробнее? не понял "хинты на блокировки".

Спасибо.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот