2012-05-13 25 views
0

現在、次の方法を使用して、実行時にパラドックステーブルにフィールドを追加しています。 「qryUpdate」と呼ばれる部品でParadoxテーブルを実行時に更新する

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; 

私は、次のクエリを持っている:クエリが実行されたときに

ALTER TABLE :UPDTABLE 
ADD :FLDNAME :FLDTYPE 

ただし、次のメッセージが表示されます。キーワードの

無効な使用を。

トークン:?

行番号:1

は私が間違って何をしているのですか?

別の質問: このようなフィールドを既存のデータベースに追加すると、既存のフィールド/データが損なわれますか?

+0

あなたはアプリケーションの外部でSQLを実行しようとしましたか?それとも監視していますか? – Shaun07776

+0

私はちょうどクエリを実行しました(私はすべてのパラメータを私がプログラムに渡しているものに置き換えました)、うまくいきました。 – MrDKOz

答えて

3

フィールドはテーブルに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; 

注「テーブルを変更」ステートメントは、あなたと異なっているの私の構文こと - テーブル名引用符で囲み、ファイルの拡張子を含みます。

+0

このアプリケーションは、私が書いた別のソフトウェアを更新するためのもので、なぜ起動時に追加するのですか?私が今夜戻ってくると、あなたのコードに一発のショットをつけて、おそらくそれを手続きに入れて、それをさまざまな分野で何度も呼び出すことができます。また、フィールドの数を取得してフィールドを追加するかどうかを判断するのに、どうして私は尋ねることができますか? – MrDKOz

+0

コードを使用しましたが、今は問題なく動作しています。どうもありがとう。 – MrDKOz

+0

@MoonPunch:フィールドの数を確認すると、フィールドが既に追加されているかどうかを知ることができます。 –