因此,我们有许多年前写过的旧VB 6应用程序。
它使用Access数据库存储数据,VB6 App作为此数据的接口
现在,改变VB6应用程序将非常困难,我试图避免这种情况。
问题是,当VB6将数据插入到访问数据库的表中时,该表有一个使用'Now()'来设置默认值的列。
现在已经对此进行了计算日期和时间值,包括乘法。因此..当任何日期/时间分量为0时,最终结果为0.
I.E dd * mm * yy * hh * n * s - 如果为零,则结果为零
为了克服这一点,我可以
•更改代码以指定日期(不是很理想)
希望在Access数据库的默认值中进行一些验证,以确保时间内没有0值
有没有办法像这样验证默认值?
像
If DatePart(‘hh’,date) == 0 OR DatePart(‘n’,date) = 0 OR DatePart(‘s’,Date) = 0
Then add one to all of them.
修改
这不是我的代码,这是我之前编写的代码,以及其他开发人员的开始。
我们无法确定我们的代码是生产中使用的代码。因此,为什么我宁愿不改变代码。我们计划在时间允许的情况下尽快重写。
问题每月只发生一次或两次,因此对应用程序的运行并不重要。
答案 0 :(得分:5)
虽然编辑VB6应用程序可能并不理想,但它是处理问题的最有效方法。
您改变数据本身的提议似乎是一个非常糟糕的主意,因为如果以后数据被其他应用程序使用,它可能会抛弃日期。最好让应用程序以其独特的需求在运行时转换数据以执行计算。
始终以最标准的标准化格式存储数据。当你不再在那里工作时,你不知道从现在起几年后谁会使用这些数据。你想要的最后一件事是新开发人员诅咒你名字的不良业力,因为你认为改变在数据库中存储日期的标准格式是个好主意。
值得注意的是,许多Date()对象或日期库已经有了计算特定日期的秒数的方法,因此它甚至可以简化您的代码。
答案 1 :(得分:0)
无法使用列DEFAULT
完成。
您可以创建一个'帮助'程序来生成日期,例如(Access Database Engine ANSI-92 Query Mode语法):
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数据库引擎之前,您可以从表中删除INSERT
和UPDATE
权限,并授予您的“帮助程序”。
此外,您应该向列添加CHECK
约束或验证规则,以确保确保未使用非法值显式插入或更新列。是的,即使权限只在你的“帮助”函数上,你也需要这个,除非你是那种只编写无错代码的神秘编码器;)
DATETIME
值中的零值存在问题。不要只是治疗症状:治愈疾病并修复错误的逻辑,
答案 2 :(得分:0)
如何更改将所有日期部分相乘的函数,以便在所有日期部分中添加一个,然后将它们相乘?至少在理论上,不需要首先考虑零,