sql - 我在delphi中不断收到 "Data type mismatch in criteria expression"错误

标签 sql delphi error-handling delphi-2010

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

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, ItemID, 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 
编辑:我认为问题出在“插入”部分。除最后一列外,所有列都是短文本,ItemPrice 是一种货币。我也在使用 Access

最佳答案

请在主窗体上仅使用以下项目开始一个新项目:

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

  • 然后,将以下代码添加到表单中
      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(... 之后的 block 中
    您应该始终以这种方式构造 SQL 语句,并且 不是 通过连接字符串
    正如您的代码尝试做的那样。它更不容易出错,因为它很容易进入
    如果您使用 DIY 代码,语法困惑,它也确保您的查询不容易
    Sql-Injection exploits , 如果你
    让用户有机会编辑 SQL。
    如果您使用的是 FireDAC FDQuery,它有 Params (FD 数据类型)而不是参数
    但它们的工作方式几乎相同 - 请参阅在线帮助。
    以后,请更加小心,以确保包含重要的细节,尤其是像 这样的内容。准确 发生错误的行 - 您可以通过使用调试器单步执行代码来检查 - 以及您正在使用的确切 db-access 组件之类的东西。还要尝试正确获取详细信息,例如列是“短文本”类型还是自动编号。
    对于需要调试的问题,比如这个,还应该提供完整的,minimal, reproducible example ,而不仅仅是一段代码。很多时候,您会在准备 mre 时意识到问题所在,因此它对您和我们都有帮助。

    关于sql - 我在delphi中不断收到 "Data type mismatch in criteria expression"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62676115/

    相关文章:

    swift - Swift 中抛出错误的函数或方法

    javascript - 如何捕获并恢复 javascript 中的全局错误?

    mysql - SQL Doctrine 除夕

    计数子句中的 SQL CASE 语句

    sql - 在 SQL 中如何选择使用一系列字符串?

    forms - TWebBrowser - 它仅在显示其 Delphi 父窗体时才工作吗?

    multithreading - Delphi中两个线程相互同步的最佳方法

    c# - 违反唯一键约束 - 无法插入重复键

    mysql - Delphi 和 MySQL - 定期弹出数据库错误 - 如何修复它?

    python - Python中的"Inner exception"(带回溯)?