delphi中不断出现“条件表达式中的数据类型不匹配”错误

z4bn682m  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(589)

每当此代码运行时,我都会得到上面的错误。代码应该将一条记录插入一个表中,然后从另一个表中删除记录。

  1. for I := iMax - K to iMax do
  2. begin
  3. Inc(a);
  4. with dmMenu.qryMcDonalds do
  5. begin
  6. SQL.Text :=
  7. 'SELECT ID, ItemID, ItemPrice, ItemCategory FROM tblCheckout WHERE ID = ' + IntToStr(I);
  8. Open;
  9. sItemID := Fields[1].AsString;
  10. rItemPrice := Fields[2].AsFloat;
  11. sItemCategory := Fields[3].AsString;
  12. ShowMessage(IntToStr(I));
  13. // I get the error here
  14. SQL.Text :=
  15. 'INSERT INTO tblOrderItems (OrderItemID, OrderID, ItemID, ItemCategory, ItemPrice) VALUES ("' + sOrderID + '_' + IntToStr(a) + '"' + ', "' + sOrderID + '", "' + sItemID + '", "' + sItemCategory + '", "' + FloatToStrF(rItemPrice, ffCurrency, 10, 2) + '")';
  16. ExecSQL;
  17. SQL.Text := 'DELETE FROM tblCheckout WHERE ID = ' + IntToStr(I);
  18. ExecSQL;
  19. end; // with SQL
  20. end; // for I

编辑:我想问题出在“插入”部分。除最后一列外,所有列都是短文本,itemprice是一种货币。我也在使用access

xa9qqrwz

xa9qqrwz1#

请在主窗体上仅使用以下项启动新项目:
配置为连接到数据库的tadoconnection;
配置为使用tadoconnection的tadoquery
一种tdatasource和tdbgrid,配置为显示tadoquery的内容。
然后,将以下代码添加到表单中

  1. const
  2. sSelect = 'select * from tblOrderItems';
  3. sInsert = 'insert into tblOrderItems(OrderItemID, OrderID, ItemID, ItemCategory, ItemPrice) '#13#10
  4. + 'values(:OrderItemID, :OrderID, :ItemID, :ItemCategory, :ItemPrice)';
  5. sOrderItemID = '0999';
  6. sOrderID = '1999';
  7. sItemID = '2999';
  8. sItemCategory = 'Bolt';
  9. fItemPrice = 5.99;
  10. procedure TForm2.FormCreate(Sender: TObject);
  11. begin
  12. AdoQuery1.SQL.Text := sInsert;
  13. AdoQuery1.Prepared := True;
  14. AdoQuery1.Parameters.ParamByName('OrderItemID').Value:= sOrderItemID;
  15. AdoQuery1.Parameters.ParamByName('OrderID').Value := sOrderID;
  16. AdoQuery1.Parameters.ParamByName('ItemID').Value := sItemID;
  17. AdoQuery1.Parameters.ParamByName('ItemCategory').Value := sItemCategory;
  18. AdoQuery1.Parameters.ParamByName('ItemPrice').Value := fItemPrice;
  19. AdoQuery1.ExecSQL;
  20. AdoQuery1.SQL.Text := sSelect;
  21. AdoQuery1.Open;
  22. end;

在编译和运行程序之前,请检查并更改常量的值,以便它们不会与表中已有的任何行冲突。
常量sinsert在 Values 列表中的项:orderitemid、:orderid等是占位符,adoquery将这些占位符转换为参数,您可以在运行时提供这些参数的值,如后面的块中所示 AdoQuery1.Parameters.ParamByName(... 您应该始终以这种方式构造sql语句,而不是像代码试图做的那样通过连接字符串。它不容易出错,因为如果您使用diy代码,很容易陷入语法混乱,而且它还确保您的查询不容易受到sql注入攻击,如果您给用户编辑sql的机会,这种情况就会发生。
如果您使用的是firedac fdquery,则 Params (一种fd数据类型)而不是thn参数,但它们的工作方式基本相同-请参阅联机帮助。
以后,请更加小心地确保包含重要的细节,特别是发生错误的确切行(可以使用调试器单步检查代码),以及使用的确切db访问组件。另外,还要尝试获取正确的详细信息,例如列是“短文本”类型还是自动编号。
对于需要调试的问题,比如这个问题,您还应该提供一个完整的、最小的、可复制的示例,而不仅仅是一段代码。很多时候,当你准备mre的时候,你会意识到问题所在,所以它对你和我们都有帮助。

展开查看全部
dtcbnfnu

dtcbnfnu2#

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

相关问题