2012-05-13 20 views
0

我正在使用以下方法在運行時將字段添加到悖論表中。在運行時更新悖論表

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.

我在做什麼錯?

另一個(相關)問題: 將這樣的字段添加到現有的數據庫是否會損害現有的字段/數據?

+0

您是否嘗試過在您的應用程序之外運行SQL?或監測它? – Shaun07776

+0

我剛剛運行了查詢(我用所傳遞的參數替換了所有參數)並且它工作正常。 – MrDKOz

回答

3

您只能將該字段添加到表格中!正如您所寫的,您的代碼將在您每次運行該程序時嘗試添加該字段。在添加新字段之前,您應該首先查看您的表中包含多少個字段。

我用下面的代碼在運行時添加字段(這是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; 

請注意,我在「改變表」語句的語法和你不一樣 - 表名用引號括起來,幷包含文件的擴展名。

+0

此應用程序用於更新我寫的另一個軟件,因此它在啓動時添加它們。當我今晚回來時,我會給你的代碼一個鏡頭,可能把它放到一個程序中,以便我可以多次調用它來處理各個領域。我也可以問,爲什麼你提取字段的數量,並用它來確定字段是否應該添加或不添加? – MrDKOz

+0

使用你的代碼,它現在工作正常。非常感謝。 – MrDKOz

+0

@MoonPunch:檢查字段數可以讓我知道該字段是否已被添加。 –