当前位置: 首页 > 知识库问答 >
问题:

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

鲜于高明
2023-03-14

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

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

共有2个答案

姚信鸥
2023-03-14

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

夏元明
2023-03-14

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

  • 配置为连接到数据库的TAdoConnection
  • Tadoqli配置为使用TAdoQuery
  • 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在列表中定义了一个所谓的“参数化SQL语句”,项:OrderItemID,:OrderID等是占位符,AdoQuery将其转换为参数,您可以在运行时提供其值,如AdoQuery1之后的块中所示。参数。ParamByName(…

您应该始终以这种方式构造SQL语句,而不是像代码所尝试的那样通过连接字符串来构造SQL语句。它不太容易出错,因为如果你使用DIY代码,很容易陷入语法混乱,而且它还确保你的查询不容易受到Sql注入攻击,如果你给用户编辑Sql的机会,这种情况就会发生。

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

以后,请更加小心地确保包含重要的细节,尤其是错误发生的确切行(可以使用调试器单步检查代码),以及正在使用的确切db access组件。此外,还应尝试正确获取详细信息,例如列是“短文本”类型还是自动编号。

对于需要调试的问题,比如这个问题,您还应该提供一个完整的、最少的、可重复的示例,而不仅仅是一段代码。通常,在准备mre时,您会意识到问题所在,因此它对您和我们都有帮助。

 类似资料:
  • 问题内容: 我正在尝试使用两个实时CSV对访问进行查询,该CSV具有一个具有不同数据类型(数字和短文本)的公共字段。我发现您可以使用’CStr’联接不同的数据类型。我已经在sql视图的代码中添加了“ CStr”。请找到下面的代码。 这给了我想要访问的输出,当我单击“数据表视图”时,现在可以看到输出。但是,当我尝试将数据导出(我实际上是在尝试创建导出规范,以便可以使用宏导出csv)作为csv时,会收

  • 我在Sybase数据库中有一个表,其中有一列is_req。它的数据类型是char(1)。它在我的hbm文件中的属性定义如下: 属性名称="is必需"列="is_req"类型="boolean" 现在,当我尝试使用标准/限制进行比较时,比如:,我得到以下例外: 如果我尝试做,我得到以下异常: com.sybase.jdbc2.jdbc.SybSQLException:不允许从数据类型'VARCHAR

  • 我得到错误“条件表达式中的数据类型不匹配”在查询中。 像这样查询工作完美 当我尝试输入另一个标准时,它会显示错误: WorkingDays返回一个整数,我尝试了其他帖子中提出的大多数解决方案。 这是工作日:

  • 问题内容: 我正在尝试在Access 2010中进行查询,但是它一直给我这个错误“条件表达式中的数据类型不匹配”。 查询很简单 难怪为什么? 问题答案:

  • 我不知道为什么这个正则表达式不匹配。也许你能发现错误。 ficontents: 我想匹配>>>>>>客户端9462<<<<<捕获该号码,以及此后的所有内容,直到另一个客户端号码。所以我的第一个捕获是“9462”,第二个捕获是“Had a program exception;please check the error log”。 它使用JavaScript设置在regex101.com中工作得很好

  • decltype(E)是一个标识符或者表达式的推断数据类型(“declared type”),它可以用在变量声明中作为变量的数据类型。例如: void f(const vector<int>& a, vector<float>& b) { // 推断表达式a[0]*b[0]的数据类型,并将其定义为Temp类型 typedef decltype(a[0]*b[0]) Tmp;