Форум TRACE MODE: техническая поддержка Послать новую тему / Post New Topic  Послать ответ / Post A Reply
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 6 » Работа с приложениями (ODBC-SQL/OPC/DDE) » Запись текущего времени в MS SQL

   
Автор / Author Тема / Topic: Запись текущего времени в MS SQL
Eman1982
Forum Member / Участник форума
Участник № / Member № 5619


Icon 1 отправлено / posted      Профиль для / Profile for Eman1982           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
В рамках программы на ТМ6.08 мне нужно записывать текущую дату и время(с точностью до секунд) в базу данных MS SQL. Здесь возникли трудности- данные не записываются.

Я создал в программе системную переменную @t_Set_Date. Создал канал TIME#1 и привязал к нему @t_Set_Date:Значение.
Создал ГЭ Текст и привязал к нему TIME#1.
Во время работы профайлера в ГЭ Текст(Формат "По умолчанию") отображается большое число, равное кол-ву секунд с 1970 г.- что соответствует описанию TIME в РП, том 1, стр.186-187.
Получается, в канал TIME записывается текущее время.

Создал шаблон связи с СУБД, запрос INSERT, аргумент типа DATE_AND_TIME, привязал к этому аргументу TIME#1:Реальное значение.

Потом создал в таблице MS SQL поле с типом DateTime. Пытаюсь записывать в это поле - не записывается. Вернее, создается 1 раз запись в БД со значением поля 1900-01-01 00:00:00.000. И все, последующие аналогичные запросы не исполняются.

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

Сообщения / Posts 45 | Из / From: Ukraine  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
AdAstra Technical Support
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for AdAstra Technical Support           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Если привязать к аргументу экрана с типом данных Date_and_time канал Time, а затем вывести значение аргумента на ГЭ "Текст" с типом отображения "по умолчанию", то в реальном времени будет отображаться время, а не число секунд.
Полагаю, что в Вашем проекте "TIME#1" это просто имя канала, а его тип HEX.

Если SQL-запрос действительно отправляется, а запись не происходит, то вероятней всего проблема в синтаксисе запроса.
Чтобы разобраться в проблеме, Вам нужно включить трассировку ODBC (через «Адмитистратор ODBC»). В файле трассировки будут указаны ошибки.

Сообщения / Posts 15120 | Из / From: Russia  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Eman1982
Forum Member / Участник форума
Участник № / Member № 5619


Icon 1 отправлено / posted      Профиль для / Profile for Eman1982           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Спасибо, с отображением разобрался. Но в БД дату и время не пишет.

Если к ГЭ Текст просто привязать переменную типа DATE_AND_TIME, то отображает действительно число-кол-во секунд с 1970 г.
Если во время привязки убрать галочку "использовать привязанный атрибут" и выбрать строку 0, то действительно отображает Дату и время.

Однако запись в БД все равно не происходит. Трассировщик пишет:

================================================
test00_0 d90-adc ENTER SQLExecDirectW
HSTMT 01B317D8 WCHAR * 0x0A5C1910 [ 67] "INSERT INTO TCurVal\ a(\ a\ 9DateTime\ a)\ aVALUES\ a(\ a\ 9'2012-03-22 13:43:08'\ a)"SDWORD67

test00_0 d90-adc EXIT SQLExecDirectW with return code -1 (SQL_ERROR)HSTMT 01B317D8 WCHAR * 0x0A5C1910 [67] "INSERT INTO TCurVal\ a(\ a\ 9DateTime\ a)\ aVALUES\ a(\ a\ 9'2012-03-22 13:43:08'\ a)" SDWORD 67

DIAG [22008] [Microsoft][SQL Native Client][SQL Server]The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. (242)

DIAG [01000] [Microsoft][SQL Native Client][SQL Server]The statement has been terminated. (3621)

Сообщения / Posts 45 | Из / From: Ukraine  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Eman1982
Forum Member / Участник форума
Участник № / Member № 5619


Icon 1 отправлено / posted      Профиль для / Profile for Eman1982           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Запрос делал Мастером. Запрос очень прост:

INSERT INTO TCurVal
(
DateTime
)
VALUES
(
'#DT#'
)

Аналогичные запросы для Integer и Real срабатывают нормально.

Сообщения / Posts 45 | Из / From: Ukraine  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
AdAstra Technical Support
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for AdAstra Technical Support           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Проверили запись в MS SQL 2008. Проблем не возникло.

По перехвату видно, что Trace Mode корректно отправляет запрос. БД отвечает, что возникает ошибка конверсии данных в формат datetime.
В целом проблема в особенностях настройки БД и выходит за рамки Trace Mode.

Сообщения / Posts 15120 | Из / From: Russia  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Eman1982
Forum Member / Участник форума
Участник № / Member № 5619


Icon 1 отправлено / posted      Профиль для / Profile for Eman1982           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Нашел причину проблемы и ее решение.
В результате экспериментов удалось выяснить следующее:

ТМ передает в SQL дату как строку '2012-03-22 15:11:55'("гггг-мм-дд"). БД такую запись не может конвертировать в дату.

Если передать в БД дату в виде '2012-22-03 15:11:55'(гггг-дд-мм), то все пишется.
Вывод- БД ждет дату в виде строки "гггг-дд-мм". Нужно либо настроить в МС SQL формат данных, как в ТМ- "гггг-мм-дд", либо передавать запрос с конвертированием даты.

Вот такой запрос у меня сработал:

============================================
INSERT INTO TCurVal
(
DT
)
VALUES
(
convert(datetime,'#DT#',101)
)

Сообщения / Posts 45 | Из / From: Ukraine  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

Quick Reply
Сообщение / Message:

HTML код не разрешен. / HTML is not enabled.
UBB код разрешен. / UBB Code is enabled.

Значки Graemlins / Instant Graemlins
   


Послать новую тему / Post New Topic  Послать ответ / Post A Reply Закрыть тему / Close Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us

Rambler's Top100 Rambler's Top100



Powered by Infopop Corporation
UBB.classic™ 6.7.2