应用程序使用错误类型的值进行当前操作

时间:2016-05-25 19:45:03

标签: delphi ado access

我有一个Delphi XE应用程序,通过ADO连接到Access MDB文件。以下代码在打开查询时给出错误“应用程序使用错误类型的值进行当前操作”。 RegDate字段是访问日期/时间类型。 dteTo和dteFrom是TDateTimePicker组件。我也尝试使用ftDate参数类型但得到相同的错误。使用ADO获取日期参数的技巧是什么?

  with DM.Query2 do
  begin
    Close;
    ParamCheck := True;
    SQL.Text:= 'SELECT Sum((ItemCost * Quantity) + GST + PST + Handling) As Total1'+
                ' FROM Software S INNER JOIN Items I ON (S.SoftwareID = I.Invoice)'+
                ' WHERE RegDate BETWEEN :Date1 AND :Date2';
    if chkPaid.Checked then
      SQL.Text:= SQL.Text+' AND S.Paid = True';
    Parameters.ParamByName('Date1').Value:= dteFrom.Date;
    Parameters.ParamByName('Date1').DataType := ftDateTime;
    Parameters.ParamByName('Date2').Value:= dteTo.Date;
    Parameters.ParamByName('Date2').DataType := ftDateTime;
    Open;
    lblYTD.Caption:= 'YTD: '+FieldByName('Total1').AsString;
    Close;
  end;

1 个答案:

答案 0 :(得分:1)

使用Delphi附带的 DBDemos.mdb 中的 Orders 表,使用Access 15( Microsoft.ACE.OLEDB.15.0 )司机,以下工作正常。除了ConnectionString,一切都在代码中完成; ADOQuery上没有预定义的参数或更改的属性。

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.SQL.Text := 'Select OrderNo, CustNo, SaleDate, ShipDate ' +
                        'From Orders ' +
                        'Where SaleDate between :Date1 and :Date2 ' +
                        'Order By CustNo, OrderNo';

  // Only for demonstration purposes
  DateTimePicker1.Date := EncodeDate(1988, 8, 1);
  DateTimePicker2.Date := EncodeDate(1988, 8, 31);
  ADOQuery1.Parameters.ParamByName('Date1').Value := DateTimePicker1.DateTime;
  ADOQuery1.Parameters.ParamByName('Date2').Value := DateTimePicker2.DateTime;
  ADOQuery1.Open;
  ShowMessage(Format('Found %d records', [ADOQuery1.RecordCount]));
  ADOQuery1.Close;
end;