В рамках программы на ТМ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, то действительно отображает Дату и время.
Однако запись в БД все равно не происходит. Трассировщик пишет:
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 формат данных, как в ТМ- "гггг-мм-дд", либо передавать запрос с конвертированием даты.