4

SQLサーバーを使用して、デルファイ7のテーブルのいくつかのフィールドを更新するプログラムを開発しています. プログラムは次のようになります。

sql := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+quotedstr(label_id_schedule.Caption)
      +',start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +',finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +',contract_location = '+quotedstr(uppercase(Edit_location.Text))
      +',sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

プログラムを実行すると、「'=' 付近の構文が正しくありません」というエラーが表示されます。しかし、showmessage を使用してクエリを表示し、SQL Server Management 2008 で実行すると、正常に動作します。

次に、クエリを次のような部分に分割しようとします。

SQL := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+QUOTEDSTR(label_id_schedule.CAPTION)
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' contract_location = '+quotedstr(uppercase(edit_location.Text))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

その後、日付型フィールドを更新するときにのみエラーが発生することがわかりました。同様のクエリを使用してさまざまなテーブルを更新する他のプログラムを開発しましたが、正常に動作します。プロジェクトを閉じて再度開いてみましたが、それでもエラーメッセージが表示されます。私が何をすべきか教えてください..

4

2 に答える 2

14

変換を回避し、データベースに依存しない保存クエリを作成するには、パラメーターを使用する必要があります。これにより、複数回使用すると操作が高速化される可能性もあります。

  Adoquery1.SQL.Text := 'UPDATE tb_dt_contract SET finish_date=:df where WHERE id =:id';
  // in some cases it may be necessary to add  the three comented lines
  //Adoquery1.Parameters.ParseSQL(Adoquery1.SQL.Text,true);
  //Adoquery1.Parameters.ParamByName('df').DataType := ftDateTime;
  //Adoquery1.Parameters.ParamByName('id').DataType := ftInteger;
  Adoquery1.Parameters.ParamByName('df').Value :=DateTime_finish.Date;
  Adoquery1.Parameters.ParamByName('ID').Value :=StrToInt(label_id.Caption);
  Adoquery1.ExecSQL;
于 2012-12-13T07:08:43.747 に答える
-1

私はそれを考え出した!(むしろ、私の同僚がそうでした)

どうやら、FormatDateTime('mm/dd/yyyy' を datetostr に置き換え、shortdateformat を 'mm/dd/yyyy' に設定した後、クエリは正常に動作します。なぜでしょうか?これらのコマンドは同じことをすると思いましたか?

于 2012-12-13T08:16:58.597 に答える