У меня странная проблема (только) с одним из столбцов базы данных SQL Server, который объявлен как datetime
. Это более крупное приложение, и я использую множество таблиц со столбцами datetime
, и все они установлены правильно (дата и время), кроме одной.
Синтаксис (например) такой:
FKMachineMeasureModulesMachineMeasureHistoryBindingSource.Current("LastTested") = Now()
Соединение с SQL Server осуществляется через наборы данных. Поэтому я предположил, что, возможно, объявление столбца, вероятно, было установлено на date
вместо datetime
, но нет, везде объявлено правильно.
Однако приведенный выше оператор приводит к результату «2024-07-18 00:00:00.000» в таблице SQL Server.
Если я обновлю столбец через SSMS, запустив
UPDATE [Machine_MeasureModules]
SET RLastTested = '18.07.2024 15:10'
WHERE id = 15271
правильно установлено значение 2024-07-18 15:10:00.000
.
Когда я отлаживаю строку и обновляю код, браузер встроенных переменных также показывает ее правильно. А вот на SQL Server всегда без времени.
Я также попробовал для этого конкретного столбца преобразовать формат Now()
, но результат тот же.
Правильно ли это работает, если вы используете UPDATE ... Now()
вместо жестко закодированной строки? Пытаюсь определить, заключается ли проблема в том, что Now()
не включает время, или, возможно, в таблице есть триггер вставки, который удаляет время и не запускается при обновлении.
(И еще, как именно вы проверяете results in '2024-07-18 00:00:00.000' in the SQL Server table.
?)
Похоже, что ваш код применяет дату в строковом формате вместо фактического экземпляра DateTime
, и я удивлен, что формат даты работает вдвое так же хорошо, как и сейчас. На самом деле вам следует отправлять реальный экземпляр DateTime
, но если вам нужны значения в строковом формате, используйте универсальный формат yyyy-MM-ddTHH:mm:ss
(обратите внимание на разделитель T
), чтобы избежать настроек DATEFORMAT
в текущем соединении, например: db<>fiddle .
@testing-for-ya: В этом суть: Now() используется примерно в сотне других случаев в проекте с точно таким же синтаксисом, и везде он работает так, как должен. Фиксация в VB после присвоения значения выполняется с помощью FKMachineMeasureModulesMachineMeasureHistoryBindingSource.EndEdit() Machine_MeasureModulesTableAdapter.Update(DataSet_Machine.Machine_MeasureModules)
и проверяется точкой останова сразу после этого, браузер/проводник переменных, вызываемый <shift><F9>, показывает правильную дату и время. Но SELECT ..
в базе данных SQL через SMSS показывает это без времени.
@AndrewMorton: региональные настройки установлены правильно, поскольку они хорошо работают, как упоминалось выше, для сотен подобных утверждений.
@AlwaysLearning: Во-первых, спасибо за ваши усилия помочь! Дело в том, что нигде во всем коде не выполняется форматирование строки Now()
. Ни в этом конкретном заявлении.
@Werner Использует ли код VB параметры SQL для передачи значений? (Но не используйте AddWithValue, поскольку это может вызвать проблемы.)
@AndrewMorton Нет. Набор данных действует как интерфейс для VB с помощью tableadapter
и bindingsource
. В моем примере я обновляю bindingsource
напрямую. Опять же, те же методы и интерфейс, которые я использую и везде.
Откройте сгенерированный кодом файл класса для набора данных и дважды проверьте, какой тип используется в этом наборе данных. Я подозреваю, что набор данных не создается повторно после внесения изменений.
@AlbertD.Kallal Я уже это сделал, и да, DBType, объявленный в .xsd
, был установлен на Date
вместо DateTime
. Поэтому я вручную пропатчил .xsd
и перекомпилировал проект, но не помогло. Однако в диспетчере источников данных я удалил столбец и сразу же добавил его снова. И: случилось чудо, теперь тип установлен правильно, и столбец сохраняет и показывает дату и время. Так что спасибо, что подтолкнули меня проверить это еще раз. Вопрос решен
Чтобы решить эту проблему, в диспетчере источников данных я удалил столбец и сразу же добавил его снова. И: случилось чудо, теперь тип установлен правильно, и столбец сохраняет и показывает дату и время.
требуется определение схемы таблицы и набора данных