我在delphi中不断收到“条件表达式中的数据类型不匹配”错误

只要此代码运行,我都会收到上述错误。该代码应该将记录插入表中,然后从另一个表中删除记录。

for I := iMax - K to iMax do
begin
  Inc(a);
  with dmMenu.qryMcDonalds do
  begin
    SQL.Text :=
      'SELECT ID,ItemID,ItemPrice,ItemCategory FROM tblCheckout WHERE ID = ' + IntToStr(I);
    Open;
    sItemID := Fields[1].AsString;
    rItemPrice := Fields[2].AsFloat;
    sItemCategory := Fields[3].AsString;

    ShowMessage(IntToStr(I));
     // I get the error here
    SQL.Text :=
      'INSERT INTO tblOrderItems (OrderItemID,OrderID,ItemCategory,ItemPrice) VALUES ("' + sOrderID + '_' + IntToStr(a) + '"' + ',"' + sOrderID + '","' + sItemID + '","' + sItemCategory + '","' + FloatToStrF(rItemPrice,ffCurrency,10,2) + '")';
    ExecSQL;

    SQL.Text := 'DELETE FROM tblCheckout WHERE ID = ' + IntToStr(I); 
    ExecSQL;
  end; // with SQL 
end; // for I 

edit:我认为我的问题出在“ INSERT INTO”部分。除最后一个列以外,所有列均为短文本,ItemPrice是一种货币。我也在使用access

iCMS 回答:我在delphi中不断收到“条件表达式中的数据类型不匹配”错误

请在主窗体上仅包含以下项目开始新项目:

  • 配置为连接到数据库的TAdoConnection;
  • 配置为使用TAdoConnection的TAdoQuery
  • 配置为显示TAdoQuery内容的TDataSource和TDBGrid。

然后,将以下代码添加到表单中

  const
    sSelect = 'select * from tblOrderItems';
    sInsert = 'insert into tblOrderItems(OrderItemID,OrderID,ItemID,ItemCategory,ItemPrice) '#13#10
    +  'values(:OrderItemID,:OrderID,:ItemID,:ItemCategory,:ItemPrice)';

    sOrderItemID = '0999';
    sOrderID = '1999';
    sItemID = '2999';
    sItemCategory = 'Bolt';
    fItemPrice = 5.99;

  procedure TForm2.FormCreate(Sender: TObject);
  begin

    AdoQuery1.SQL.Text := sInsert;
    AdoQuery1.Prepared := True;

    AdoQuery1.Parameters.ParamByName('OrderItemID').Value:= sOrderItemID;
    AdoQuery1.Parameters.ParamByName('OrderID').Value := sOrderID;
    AdoQuery1.Parameters.ParamByName('ItemID').Value := sItemID;
    AdoQuery1.Parameters.ParamByName('ItemCategory').Value := sItemCategory;
    AdoQuery1.Parameters.ParamByName('ItemPrice').Value := fItemPrice;

    AdoQuery1.ExecSQL;

    AdoQuery1.SQL.Text  := sSelect;
    AdoQuery1.Open;
  end;

在编译和运行程序之前,请检查并更改常量的值 这样它们就不会与表中已有的任何行冲突。

常量sInsert在Values内定义了所谓的“参数化SQL语句” 列表中的:OrderItemID,:OrderID等项目是AdoQuery会变成的占位符 您可以在运行时提供其值的参数,例如AdoQuery1.Parameters.ParamByName(...

之后的块中

您应该始终以这种方式构造SQL语句,并通过串联字符串 正如您的代码尝试做的那样。它不容易出错,因为它很容易进入 如果您使用DIY代码,则语法混乱,这还可以确保您的查询不容易出现 到Sql-Injection exploits,如果您 为用户提供了编辑SQL的机会。

如果您使用的是FireDAC FDQuery,则它具有Params(FD数据类型)而不是参数 但是它们的工作方式几乎相同-请参见在线帮助。

以后,请务必谨慎一些,以确保其中包含重要的细节,尤其是发生错误的 exact 行之类的东西-您可以通过使用调试器-以及您正在使用的确切的db-access组件之类的东西。另外,请尝试正确获取详细信息,例如列是“短文本”类型还是自动编号。

对于像这样的需要调试的问题,您还应该提供完整的minimal,reproducible example,而不仅仅是一小段代码。通常,您在准备矿井时会意识到问题出在哪里,因此它对您和我们都有帮助。

,

我敢打赌,问题出在不兼容的浮点格式中。 使用参数来避免它。

本文链接:https://www.f2er.com/2021376.html

大家都在问