在运行时更新悖论表

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 声明两个临时表,在运行更新查询时循环遍历两个数据集。

悖论数据库的java更新查询

每次在 MATLAB 中运行代码时,如何更新下一列中我的 Excel 工作表中的计算数据?

在运行其他代码时打开和更新文本框*上的显示访问表单*

加载视图后如何在运行时更新 UITableView