【问题标题】:How to convert a string into date in order to manipulate database如何将字符串转换为日期以操作数据库
【发布时间】:2017-10-21 09:34:55
【问题描述】:

我是编码新手,并且有一个学校项目。 我正在尝试将字符串转换为日期以更新/删除数据库中的记录,但它不断给我一个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;

谢谢。

【问题讨论】:

  • 不要用字符串连接填写值:那么你很容易受到sql injection的攻击。了解如何在查询中使用参数 - 这也将正确转换日期和其他类型的值。
  • 尝试更广泛认可的格式 yyyy-mm-dd 但您确实应该远离准备 sql 的方式。请注意,格式是一种预感而不是确定性。它会因 dbms 设置和它是哪个 dbms 而不同。

标签: sql delphi-7 ado


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多