This is topic Запись текущего времени в MS SQL in forum Работа с приложениями (ODBC-SQL/OPC/DDE) at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/41/t/000069.html

Posted by Eman1982 (Участник № / Member № 5619) on :
 
В рамках программы на ТМ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. И все, последующие аналогичные запросы не исполняются.

Подскажите, почему не получается корректно записывать дату и время.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если привязать к аргументу экрана с типом данных Date_and_time канал Time, а затем вывести значение аргумента на ГЭ "Текст" с типом отображения "по умолчанию", то в реальном времени будет отображаться время, а не число секунд.
Полагаю, что в Вашем проекте "TIME#1" это просто имя канала, а его тип HEX.

Если SQL-запрос действительно отправляется, а запись не происходит, то вероятней всего проблема в синтаксисе запроса.
Чтобы разобраться в проблеме, Вам нужно включить трассировку ODBC (через «Адмитистратор ODBC»). В файле трассировки будут указаны ошибки.
 
Posted by Eman1982 (Участник № / Member № 5619) on :
 
Спасибо, с отображением разобрался. Но в БД дату и время не пишет.

Если к ГЭ Текст просто привязать переменную типа 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)
 
Posted by Eman1982 (Участник № / Member № 5619) on :
 
Запрос делал Мастером. Запрос очень прост:

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

Аналогичные запросы для Integer и Real срабатывают нормально.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Проверили запись в MS SQL 2008. Проблем не возникло.

По перехвату видно, что Trace Mode корректно отправляет запрос. БД отвечает, что возникает ошибка конверсии данных в формат datetime.
В целом проблема в особенностях настройки БД и выходит за рамки Trace Mode.
 
Posted by Eman1982 (Участник № / Member № 5619) on :
 
Нашел причину проблемы и ее решение.
В результате экспериментов удалось выяснить следующее:

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

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

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

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


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2