2017-10-21 7 views
-2

私はコーディングに新しく、学校向けのプロジェクトを持っています。 データベースからレコードを更新/削除するために文字列を日付に変換しようとしていますが、常にData type mismatch in criteria expressionというエラーが表示されます。データベースのフィールド(日付が予約されている)は日付として検証され、文字列入力を日付形式に変換し、データベースからレコード全体を削除しようとしています。データベースを操作するために文字列を日付に変換する方法

sdelete:= combobox.text; //shows options of dates 
    Year := StrToInt(Copy(sdelete, 1, 4)); 
    Month := StrToInt(Copy(sdelete, 6, 2)); 
    day := StrToInt(Copy(sdelete, 9,2)); 
    date := EncodeDate(Year, Month,Day); 
end;//Converting to date format 

`ADOdelete.SQL.Text := 'SELECT * FROM [scout] WHERE ([Password] = 
"'+Sscout+'"AND [date booked] ="'+FormatDateTime('yyyy/mm/dd',Date)+'")';` 
    ADOdelete.Open; 
    ADOdelete.Close; 
ADOdelete.SQL.Text:= 'Delete from [scout] WHERE ([date booked] 
    ="'+FormatDateTime('yyyy/mm/dd',Date)+'"AND [password]="'+sscout+'")'; 
    ADOdelete.ExecSQL; 
    ADOdelete.Free;` 

[Scout]テーブル名 で、Sscoutは内に保存パスワードが設定されているプラ​​イベート変数です。 コンボボックスは、このようなyyyy/mm/dd としてデータベース([予約日])とディスプレイの金額によって移入し、私は、次の変数

var  sdelete:string; 
      Day, Month, Year: Word; 
      date:Tdatetime; 

を持っているがありがとうございました。

+0

文字列連結で値を入力しないでください。[sql injection](https://en.wikipedia.org/wiki/SQL_injection)の脆弱性があります。クエリでパラメータを使用する方法については、日付やその他のタイプの値の正しい変換も行います。 –

+0

より広く認識されているフォーマットyyyy-mm-ddを試してください。しかし、SQLを準備する方法から離れるべきです。形式が確実ではないことに注意してください。 dbms設定とdbmsによって異なります。 –

答えて

2

代わりにparameterized queriesを使用してください。 DBドライバはエスケープと書式設定を処理します。例:

var 
    sDelete: string; 
    dtBooked: TDate; 
    fmt: TFormatSettings; 
begin 
    sDelete := ComboBox.Text; //shows options of dates 

    fmt := TFormatSettings.Create; 
    fmt.DateSeparator := '/'; // or '-' depending on your needs... 
    fmt.ShortDateFormat := 'yyyy/mm/dd'; 
    dtBooked := StrToDate(sDelete, fmt); 

    ADOdelete.SQL.Text := 'SELECT * FROM [scout] WHERE ([Password] = :password AND [date booked] = :booked)'; 
    ADOdelete.Parameters.ParamByName('password').Value := sScout; 
    ADOdelete.Parameters.ParamByName('booked').Value := dtBooked; 
    ADOdelete.Open; 
    ... 
    ADOdelete.SQL.Text := 'Delete from [scout] WHERE ([date booked] = :booked AND [password] = :password)'; 
    ADOdelete.Parameters.ParamByName('booked').Value := dtBooked; 
    ADOdelete.Parameters.ParamByName('password').Value := sScout; 
    ADOdelete.ExecSQL; 
    ... 
end; 
関連する問題