Дата доступа к базе данных по умолчанию не может содержать 00 часов, 00 минут или 00 секунд - PullRequest
0 голосов
/ 01 октября 2009

Итак, у нас есть старое приложение VB 6, написанное много лет назад.

Он использует базу данных Access для хранения данных и приложение VB6 в качестве интерфейса к этим данным. Теперь изменить приложение VB6 будет довольно сложно, и я пытаюсь этого избежать.

Проблема в том, что, когда VB6 вставляет данные в таблицу в базе данных доступа, в таблице есть столбец, который использует «Now ()» для установки значения по умолчанию.

Теперь для этого выполняются вычисления. значение даты и времени, включая умножение. Итак ... когда любой из компонентов даты / времени равен 0, конечный результат равен 0.

I.E дд * мм * ггг * чч * н * с - если они равны нулю, результат равен нулю

Преодолеть это я могу
• Измените код, чтобы указать дату (не очень идеально)
, мы надеемся, в значении по умолчанию для базы данных Access введет некоторую проверку, чтобы убедиться, что во времени нет 0 значений

Есть ли способ проверить значение по умолчанию, как это? Что-то вроде

If DatePart(‘hh’,date) == 0 OR DatePart(‘n’,date) = 0 OR DatePart(‘s’,Date) = 0
Then add one to all of them.

Редактировать
Это не мой код, это код, написанный раньше, чем я и другие разработчики.
Мы не можем быть уверены, что код, который у нас есть, - это код, используемый в производстве. Поэтому я бы не хотел менять код. Мы планируем переписать это в ближайшее время, когда позволит время.
Проблема возникает только один или два раза в месяц, поэтому она не является жизненно важной для запуска приложения.

Ответы [ 3 ]

5 голосов
/ 01 октября 2009

Хотя редактирование приложения VB6 может быть не идеальным, это будет самый надежный способ решения проблемы.

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

Всегда храните ваши данные в максимально возможном стандартном формате. Вы не представляете, кто будет использовать эти данные через годы, когда вы там больше не работаете. Последнее, что вам нужно, это плохая карма нового разработчика, который проклинает ваше имя, потому что вы думали, что было бы неплохо изменить стандартный формат хранения дат в базе данных.

Стоит также отметить, что многие объекты Date () или библиотеки дат уже имеют способы вычисления количества секунд в конкретной дате, поэтому это может даже упростить ваш код.

0 голосов
/ 31 января 2011

как насчет изменения функции, которая умножает все части даты, чтобы она добавляла одну ко всем частям даты, а затем умножала их? нет нужды сначала проверять ноль, по крайней мере, теоретически.

0 голосов
/ 01 октября 2009

Не может быть сделано с использованием столбца DEFAULT.

Вы можете создать вспомогательную процедуру для генерации даты, например, (Access Database Engine Режим запросов ANSI-92 синтаксис):

CREATE PROCEDURE AddOrderWithDefaultDate
(
  arg_OrderID INTEGER, 
  arg_CustomerID NVARCHAR(5), 
  arg_EmployeeID INTEGER 
)
AS 
INSERT INTO Orders (OrderID, CustomerID, EmployeeID, OrderDate) 
SELECT DISTINCT arg_OrderID, arg_CustomerID, arg_EmployeeID, 
       DATE() 
          + TIMESERIAL(
                       IIF(DATEPART('H', NOW()) = 0, 1, DATEPART('H', NOW())), 
                       IIF(DATEPART('N', NOW()) = 0, 1, DATEPART('N', NOW())), 
                       IIF(DATEPART('N', NOW()) = 0, 1, DATEPART('S', NOW()))
                      ) AS OrderDate
       FROM Products;

До версии ACE (2007) Access Database Engine вы могли удалить привилегии INSERT и UPDATE из таблицы и предоставить вашим вспомогательным процедурам.

Кроме того, необходимо добавить в столбец ограничение или правило проверки CHECK, чтобы гарантировать, что столбец не будет явно вставлен или обновлен с использованием недопустимого значения. Да, вам это нужно, даже если права принадлежат только вашим «вспомогательным» функциям, если вы не являетесь мифическим программистом, который пишет только код без ошибок;)

Но, честно говоря, зачем? Похоже, проблема в том, что ваша бизнес-логика не может обрабатывать нули в значениях DATETIME. Не просто лечить симптомы: вылечить болезнь и исправить неисправную логику,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...