2017-04-13 5 views
1

私はDelphiでデータベースを更新しようとしていますが、正しくできません。Delphi Adoquery SQLの追加またはテキスト

私が欲しいのは簡単です。これは私のコードです:

form1.ADOQuery1.SQL.Clear; 
form1.ADOQuery1.SQL.Add('Update Table1 set mark=' +Form1.Edit4.Text); 
form1.ADOQuery1.ExecSQL; 

だから、基本的に、私が欲しいのは、私のデータベーステーブルがtable1で、フィールドがmark命名されUPDATE機能、と私のデータベースに入るには、[編集]で書かれたテキストです。

+1

ようこそ:

より安全なアプローチではなく、パラメータ化クエリを使用して、ADOはあなたのための書式必要な任意のSQLを(TADOQuery.ParamCheckが真であることを確認してください)を処理できるようにすることです。 'mark'フィールドの実際のデータ型は何ですか?そして、あなたは 'Edit4'をどのような価値観に入れていますか? SQLがどのようにフォーマットされる必要があるかは大きく異なります。 –

+0

なぜブール値のような値にテキストフィールドを使用していますか?実際のバイト/ブール型ではなく、または少なくとも整数です。 –

答えて

2

あなたの質問には、決定的な回答を得るのに十分な情報がありません。しかし、私は推測を推測することができます。

markが序数フィールドまたはブール値フィールドとして定義されており、ユーザーがTEditに適切な数値/ブール値を入力している場合にのみ表示されます。

ただし、markフィールドがテキストフィールドとして定義されている場合は、Textの値を引用符で囲む必要があります。無効なSQL構文が生成されます。

Textの値を'hello world'と入力したとします。

Update Table1 set mark=hello world 

あなたが代わりに引用符でテキスト値をラップする必要があります:あなたのオリジナルのSQL文が無効な構文である、次のようになってしまうでしょう

Update Table1 set mark='hello world' 

または:

Update Table1 set mark="hello world" 

例:

form1.ADOQuery1.SQL.Add('Update Table1 set mark=' + QuotedStr(Form1.Edit4.Text)); 

または:

form1.ADOQuery1.SQL.Add('Update Table1 set mark=' + AnsiQuotedStr(Form1.Edit4.Text, #34)); 

SQLインジェクション攻撃を避けるために(Ansi)QuotedStr()のような機能を使用することが重要です。これは、入力テキスト内の埋め込み引用符文字がエスケープされたプロパティであることを保証することによって行われます。あなたはこの代わりのような何かをした場合はそれ以外の場合は、:

form1.ADOQuery1.SQL.Add('Update Table1 set mark="' + Form1.Edit4.Text + '"'); 

ユーザーが'"; <arbitrary SQL here>'のようなテキスト値を入力し、データベースと本当に臭い大混乱でした。スタックオーバーフロー

form1.ADOQuery1.SQL.Clear; 
form1.ADOQuery1.SQL.Add('Update Table1 set mark=:Mark'); 
form1.ADOQuery1.Parameters.ParamByName('Mark').Value := Form1.Edit4.Text; 
form1.ADOQuery1.ExecSQL; 
+0

SQL注入攻撃を避けるために(Ansi)QuotedStr()のような関数を使用するために1+。 – Fero

関連する問題