procedure TtestMain.yi_ado_dbgCellClick(Column: TColumnEh);
var
   xuhao: Integer;
begin
  xuhao := up_adoq.FieldByName('序号').AsInteger;
  { 当选择dbgrid的时候把下方dbgrid对应的商品信息的Adoquery给对应修改下 }
  With down_adoq do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select * from down_order WHERE 序号=' + xuhao);
    Open;
  end;
简介:就是一个界面上有上下两个表(dbgrid),当选中上面的那个表某行的时候,对应的查询下下面这个表中和选中行的序号一样的数据,上面那个表的adoquery是up_adoq,下面这个表的adoquery是down_adoq错误:1.SQL.Add()方法要求里面是字符串,所以上面我那样写是错误的,因为xuhao是integer类型的但是如果改成下面这样:procedure TtestMain.yi_ado_dbgCellClick(Column: TColumnEh);
var
   xuhao: string;
begin
  xuhao := up_adoq.FieldByName('序号').AsString;
  { 当选择dbgrid的时候把下方dbgrid对应的商品信息的Adoquery给对应修改下 }
  With down_adoq do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select * from down_order WHERE 序号=' + xuhao);
    Open;
  end; 
还是会错误,错误提示是:标准表达式中数据类型不匹配,原因不解,用的是access数据库,上下两个表中的序号都是"数字"字段求高手解答,我已看了,20多篇文章还是没有找到解决方法,望高手们可以试下,这个错误网上很多人遇到,但是大多数都是.net相关的变通方案,delphi的没有找到一篇,望delphi高手来帮忙

解决方案 »

  1.   


    //看到底序号是什么类型的,看数据库定义
    //字符串型
    SQL.Add(Format('select * from down_order WHERE 序号=''%s''',[xuhao]));
    //整型
    SQL.Add(Format('select * from down_order WHERE 序号='%d',[xuhao]));
      

  2.   

    不是语法的问题,是过程的问题。
    你这个过程应该写在up_adoq的AfterScroll中。只有记录移动后再执行。
    你现在的的方法可能存在,记录并未定位成功,xuhao := up_adoq.FieldByName('序号').AsString;
    xuhao可能是空值,自己看下,你最后生成的的SQL语句吧。procedure TtestMain.yi_ado_dbgCellClick(Column: TColumnEh);
    var
       xuhao: string;
    begin
      xuhao := up_adoq.FieldByName('序号').AsString;
      { 当选择dbgrid的时候把下方dbgrid对应的商品信息的Adoquery给对应修改下 }
      With down_adoq do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select * from down_order WHERE 序号=' + xuhao);
    //    Open;
        self.caption:=sql.text;
      end;
      

  3.   

    procedure TtestMain.yi_ado_dbgCellClick(Column: TColumnEh);
    var
       xuhao: string;
    begin
      xuhao := up_adoq.FieldByName('序号').AsString;
      { 当选择dbgrid的时候把下方dbgrid对应的商品信息的Adoquery给对应修改下 }
      With down_adoq do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select * from down_order WHERE 序号=''' + xuhao+'''');
        Open;
      end;写简单点不好吗?
      

  4.   


    //整型
    SQL.Add(Format('select * from down_order WHERE 序号=%d',[xuhao]));//改一下,这里写错了
      

  5.   

    这两句错了:
       SQL.Add('select * from down_order WHERE 序号=' + xuhao);
       Open;
    1、sql的语法中字符串类型的数据要加引号。SQL.Add(Format('select * from down_order WHERE 序号=''%s''', [xuhao]);
    或 SQL.Add('select * from down_order WHERE 序号='+''''+xuhao+'''');2、Open是打开一个数据集,执行sql语句应该用ExecSQL
      

  6.   

    我一般用参数的,没遇到过报错
    SQL.Add('select * from down_order WHERE 序号=:a');
    ParamByName('a').Value:=xuhao;
      

  7.   

    看起来挺简单的事,多讨论几次变的复杂了,建议重建table,把这两个dbgrid 及其相对应的adoquery删了,再重新建立,说不定就行了,^_^
      

  8.   

    建议解决方法;
      1.事件应写在AdoQuery的AfterScroll事件下,实现主从表。
      2.用参数实现,用法参见7楼。