TADOQuery returns 第二次执行时为空记录集

TADOQuery returns empty recordset in second execution

我对 MS Access 数据库使用 TADOQuery 时遇到了一个令人难以置信的情况。
在下面的代码中(只是一个测试用例),第一次执行查询 returns 正确的记录,第二次执行 returns 代替 "empty" 记录(即 codFormula 变量第一次是'E0275',第二次是'').

显然三个参数值是一样的

  QryDosaggioTestata.Parameters[0].Value := idBatchRottura;
  QryDosaggioTestata.Parameters[1].Value := nrMiscelataRottura;
  QryDosaggioTestata.Parameters[2].Value := dataBatchRottura;

  QryDosaggioTestata.Open;
  //  Here, QryDosaggioTestata's RecordCount is 1 and Eof is False
  codFormula := trim(QryDosaggioTestataCodiceFormula.Value);
  //now codFormula = 'E0275'
  QryDosaggioTestata.Close;

  QryDosaggioTestata.Parameters[0].Value := idBatchRottura;
  QryDosaggioTestata.Parameters[1].Value := nrMiscelataRottura;
  QryDosaggioTestata.Parameters[2].Value := dataBatchRottura;

  QryDosaggioTestata.Open;
  //  Here, QryDosaggioTestata's RecordCount is 0 and Eof is True
  codFormula := trim(QryDosaggioTestataCodiceFormula.Value);
  // now codFormula = ''
  Ora := QryDosaggioTestataOra.Value;
  QryDosaggioTestata.Close;

查询文本在设计器对象中:

Select * from LOG_FINE_DOSAGGIO
WHERE
idBatch = :parIdBatch
AND nrMiscelata = :parNrMiscelata
AND Data = :parData

显然查询在语法上是正确的,否则第一次执行得不好。 非常感谢。

经过多次尝试,我得到了线索:Microsoft JET OLEDB 4.0 提供程序对日期参数的处理非常糟糕:使其工作的唯一方法是,对于日期参数,设置参数数据类型为 ftString 并将值作为 DateToStr(yourDate) 传递。

我的印象是,在第一次 query.Close 之后,提供商以错误的方式重新准备了查询参数。

希望这对任何人都有帮助。 一切都适用于其他参数类型(即整数、字符串...)和 SQL 服务器提供商。