如何将字符串转换为日期以便操纵数据库

问题描述:

我是新来编码和有一个学校项目。 我想将字符串转换为日期以更新/删除数据库中的记录,但它不断给我一个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注入](https://en.wikipedia.org/wiki/SQL_injection)的影响。了解如何在查询中使用参数 - 这也将对日期和其他类型的值进行正确的转换。 –

+0

尝试一种更广泛认可的格式yyyy-mm-dd,但是您真的应该远离您准备sql的方式。请注意,格式不是一种确定性。它会因dbms设置和它是哪个dbms而有所不同。 –

您应该使用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;