【问题标题】:Adding Date into Access Database with SQL INSERT statement使用 SQL INSERT 语句将日期添加到 Access 数据库中
【发布时间】:2016-09-16 16:03:16
【问题描述】:

在我的 SQL 语句中添加日期字段时遇到问题 - 没有语法错误,但它将日期保存为 1905-06-17 有什么提示吗?

变量是

ExpireDate : String;

价值

ExpireDate := DateToStr(IncYear(Today,1));

声明

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table SET Member_ExpireDate = '+ ExpireDate +' WHERE Member_ID = .................';

【问题讨论】:

标签: sql delphi ms-access delphi-7


【解决方案1】:

您正在使用依赖于用户当前操作系统区域设置的DateToStr() 版本。 DB 具有他们期望日期/时间字符串表达的特定格式,并且操作系统的区域设置可能与这些格式不匹配。您可以使用DateToStr() 的重载版本,它将TFormatSettings 作为输入,这样您就可以指定输出字符串的确切格式(通过TFormatSettings.ShortDateFormat 成员):

var
  fmt: TFormatSettings;
  ExpireDate: string;

fmt := TFormatSettings.Create;
fmt.ShortDateFormat := 'yyyy-mm-dd';
ExpireDate := DateToStr(IncYear(Today,1), fmt);

此外,日期/时间字符串需要在 SQL 语句中用引号括起来。为此,您可以使用QuotedStr() 函数。

但更重要的是,您的INSERT 语句无论如何都是错误的。

如果您尝试添加新记录,它需要看起来更像这样:

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table (Member_ID, Member_ExpireDate) VALUES (' + SomeIDValue + ', ' + QuotedStr(ExpireDate) + ')';

否则,如果您尝试修改现有记录,则需要改用UPDATE 语句:

datamodule1.qryDB1.SQL.Text := 'UPDATE table SET Member_ExpireDate = ' + QuotedStr(ExpireDate) + ' WHERE Member_ID = ' + SomeIDValue;

无论哪种方式,最好使用参数化查询。让数据库自己为您处理所有必要的格式:

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table (Member_ID, Member_ExpireDate) VALUES (:MemberID, :ExpireDate)';
datamodule1.qryDB1.ParamByName('MemberID').AsInteger := SomeIDValue; // or whatever data type your field uses
datamodule1.qryDB1.ParamByName('ExpireDate').AsDate := IncYear(Today,1);
datamodule1.qryDB1.ExecSQL;

datamodule1.qryDB1.SQL.Text := 'UPDATE table SET Member_ExpireDate = :ExpireDate WHERE Member_ID = :MemberID';
datamodule1.qryDB1.ParamByName('ExpireDate').AsDate := IncYear(Today,1);
datamodule1.qryDB1.ParamByName('MemberID').AsInteger := SomeIDValue; // or whatever data type your field uses
datamodule1.qryDB1.ExecSQL;

【讨论】:

    【解决方案2】:

    不要将日期转换为字符串。将数据作为日期插入并使用参数来最小化错误。使用参数组件将数据时间格式化为正确的格式。

    var
      ExpireDate : TDate;
    begin
      ExpireDate := IncYear(Today,1);
      datamodule1.qryDB1.SQL.Text := 
         'INSERT INTO table SET Member_ExpireDate = :expireDate WHERE Member_ID = ..';
      datamodule1.qryDB1.Params.ParamByName('expireDate').Value := ExpireDate;
    

    根据您使用的组件,ParamByName 可能会有些不同,但所有TQuery 后代组件都有此方法。

    问候。

    【讨论】:

      【解决方案3】:

      感谢您解决了响应问题...应该使用 #'+ExpireDate+'# 现在一切正常,谢谢。

      【讨论】:

      • 这并不完全准确。除了# 前缀/后缀,您还需要特定的日期格式。即'#' + FormatDateTime('yyyy-MM-dd', DT) + '#' 阅读@Remy 的答案以获取详细信息。您的解决方案可能会在使用不同语言环境的其他操作系统上失败。
      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多