在运行时更新悖论表
Posted
技术标签:
【中文标题】在运行时更新悖论表【英文标题】:Updating a Paradox Table at RunTime 【发布时间】:2012-05-13 15:34:09 【问题描述】:我目前正在使用以下方法在运行时向悖论表添加字段。
procedure TfrmMain.AddField(UpdTable, FieldName, FieldType: string);
begin
with qryUpdate do
begin
Close;
ParamByName('UPDTABLE').AsString := UpdTable;
ParamByName('FLDNAME').AsString := FieldName;
ParamByName('FLDTYPE').AsString := FieldType;
ExecSQL;
Open;
end;
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
AddField('Test','newfield', 'VARCHAR(30)');
end;
在名为“qryUpdate”的组件中,我有以下查询:
ALTER TABLE :UPDTABLE
ADD :FLDNAME :FLDTYPE
但是,当执行查询时,会显示以下消息:
关键字使用无效。
令牌:?
行号:1。
我做错了什么?
另一个(相关)问题: 将这样的字段添加到现有数据库会完全损害现有字段/数据吗?
【问题讨论】:
您是否尝试过在您的应用程序之外运行 SQL。还是监控它? 我刚刚运行了查询(我将所有参数替换为我通过程序传递给它的参数)并且运行良好。 【参考方案1】:您只能将字段添加到表中一次!编写的代码将在每次运行程序时尝试添加该字段。在添加新字段之前,您应该首先检查您的表包含多少个字段。
我曾经使用以下代码在运行时添加字段(这是用于 BDE/Paradox 表)
with ttable.create (nil) do
try
databasename:= 'whatever';
tablename:= 'test.db';
open;
fc:= fieldcount;
close;
finally
free
end;
if fc = 7 then
with tquery.create (nil) do
try
databasename:= 'whatever';
close;
sql.add ('alter table "test.db" add newfield varchar (30)');
execsql
end;
finally
free
end;
请注意,我的“alter table”语句的语法与您的不同 - 表名包含在引号中并包含文件的扩展名。
【讨论】:
此应用程序用于更新我编写的另一款软件,因此它为什么在启动时添加它们。当我今晚回来时,我会给你的代码一个镜头,可能把它放到一个过程中,这样我就可以在不同的领域多次调用它。另外请问,您为什么要获取字段数并使用它来确定是否应该添加字段? @MoonPunch:检查字段数让我知道该字段是否已添加。 你不能对字段名执行if语句来确定指定字段是否存在而不是整数吗?以上是关于在运行时更新悖论表的主要内容,如果未能解决你的问题,请参考以下文章
sql 声明两个临时表,在运行更新查询时循环遍历两个数据集。