我有一个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;
答案 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;