如何在Delphi中运行时使用SQL在Access数据库中创建计算字段

时间:2009-12-04 16:32:57

标签: sql delphi field ado

我在运行时创建一个表。我就是这样做的:

AdoCommand1.Connection:=AdoConnection1;
cs:='CREATE TABLE '+edname.text+' (' +
'ID Integer IDENTITY(1,1) NOT NULL UNIQUE PRIMARY KEY,' +
'[Date Added] DATETIME,'+
'[Name] TEXT(255))';
ADOCommand1.CommandText:=cs;
ADOCommand1.Execute;

我需要添加一个字段“age”,应该像这样自动计算:

age = DateDiff ('y',[Date Added], Now()) ,这只是给出了存储项目的天数。我如何在运行时执行此操作?有没有办法将动态计算字段添加到Access数据库?

注意:我使用Delphi 7,ADO组件和Microsoft Jet 4.0连接到MDB数据库。

2 个答案:

答案 0 :(得分:1)

创建一个view(在Access中称为查询),它返回计算出的数据。 SQL语法与SQL Server相同。

CREATE VIEW TABLEVIEW AS
  SELECT TABLE.*, DATE() - TABLE.[DATE ADDED] AS AGE
  FROM [Table];

您还可以通过创建一个新的查询在ACCESS GUI中创建它,这使您能够使用sql进行播放/测试,直到它返回您期望的正确数据。

选择此数据时,就像普通表一样:

SELECT * FROM TABLEVIEW WHERE AGE > 30

答案 1 :(得分:0)

JET不支持表中的计算字段。使用计算字段创建一个并行查询 - 查询应该像原始表一样可以更新。

[更新以回应OP的评论]

“查询”是视图的JET用语,而通过ADO的JET将接受或多或少的标准SQL CREATE VIEW语句。因此,您应该能够:

ADOCommand1.CommandText := 
  'CREATE VIEW TableNameVw AS SELECT *, (DateDiff (''y'',[Date Added], Now())) AS [Age] FROM TableName';
ADOCommand1.Execute;

这将在数据库中创建一个新视图(AKA查询)。因为它是单表非聚合视图,所以您应该能够将其更新为就像它是一个表一样。

(所有这些都假设JET级别支持DATEDIFF功能,我认为这可能是正确的。)