У меня странная проблема (только) с одним из столбцов базы данных 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 и перекомпилировал проект, но не помогло. Однако в диспетчере источников данных я удалил столбец и сразу же добавил его снова. И: случилось чудо, теперь тип установлен правильно, и столбец сохраняет и показывает дату и время. Так что спасибо, что подтолкнули меня проверить это еще раз. Вопрос решен





Чтобы решить эту проблему, в диспетчере источников данных я удалил столбец и сразу же добавил его снова. И: случилось чудо, теперь тип установлен правильно, и столбец сохраняет и показывает дату и время.
требуется определение схемы таблицы и набора данных