刚学delphi不久,小白一枚。
Delphi7中query添加了所有字段,添加sql语句时只搜索显示某些字段,为嘛其它不需要的字段老报错,提示找不到?
是不是添加字段都必须显示的呢?
然后删除到只剩一个字段,能显示了,但搜索的其他字段又看不到了!如何解决?

解决方案 »

  1.   

    query  的查询语句, 可以将查询的所有字段自动添加好。
    你不需要手工添加。将query 内添加的字段,全部删除,就OK了。
      

  2.   

    我想实现某布尔字段的ongettext事件,就必须添加某一个布尔字段,如果只添加这个布尔字段,搜索的时候就只显示这个布尔字段,其他字段就显示不了。如果删除,这个布尔字段就只显示false或者ture了。所以很纠结。我想了解的是除了ongettext事件外,如何才能实现布尔类型字段不显示false或true,而显示对或错的自定义文字呢?或者query添加了字段,如何动态添加其他需要显示的字段,因为后面搜索显示的字段有多有少。我之前的方法是添加几个要查的字段,然后不同搜索的时候删除多余字段,用destroy的方法或free;但能查了,不报错,但继续点击搜索按键就报错了。不能连续查。
      

  3.   

    query中的字段要和SQL语句结果集的字段要一致,比如QL语句是:
    select 编号,名称 from 表
    那么query的字段中就要有编号,名称这些字段
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);begin
      query1.DatabaseName:=ExtractFilePath(opendialog1.FileName);
      if  memo1.Text='' then
        begin
          showmessage('请选择查询文件!') ;
        end
      else if  listbox1.ItemIndex=-1 then
        begin
          showmessage('请选择查询类别!') ;
        end
      else if (edit1.Text='') then
        begin
          showmessage('请输入数值!') ;
        end
      else if listbox1.Items[listbox1.ItemIndex]='区段限速' then
        begin
          query1.Fields[5].FieldName:='起点公里标';
          query1.Fields[6].FieldName:='终点公里标';
          query1.fields[7].Destroy;   //此行造成了报错,错误信息:query1:cannot perform this operation on an open dataset.
          query1.close;
          query1.sql.clear;
          query1.sql.add('select JLH 交路号,SXX 行别,XXLX 类别代码,CZM 类别,CZH 车站号,BH 起点公里标,GLB 终点公里标');
          query1.sql.add('from '+ExtractFileName(opendialog1.FileName)+'');
          query1.sql.add('where xxlx="31" OR (BH=:BH1 and xxlx="83") or (GLB=:BH1 and xxlx="83")');   //查询车站信息或者数值且是区段限速类型
          query1.params[0].AsInteger:=strtoint(edit1.text);
          query1.prepare;
          query1.open;
          query1.Filtered:=false;
          DBgrid1.Columns[0].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[0].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[1].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[1].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[2].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[2].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[3].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[3].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[4].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[4].Alignment:=taCenter;//内容居中
        end
    end;
      

  5.   


    procedure TForm1.Button1Click(Sender: TObject);begin
      query1.DatabaseName:=ExtractFilePath(opendialog1.FileName);
      if  memo1.Text='' then
        begin
          showmessage('请选择查询文件!') ;
        end
      else if  listbox1.ItemIndex=-1 then
        begin
          showmessage('请选择查询类别!') ;
        end
      else if (edit1.Text='') then
        begin
          showmessage('请输入数值!') ;
        end
      else if listbox1.Items[listbox1.ItemIndex]='区段限速' then
        begin
          query1.Fields[5].FieldName:='起点公里标';
          query1.Fields[6].FieldName:='终点公里标';
          query1.fields[7].Destroy;   //此行造成了报错,错误信息:query1:cannot perform this operation on an open dataset.
          query1.close;
          query1.sql.clear;
          query1.sql.add('select JLH 交路号,SXX 行别,XXLX 类别代码,CZM 类别,CZH 车站号,BH 起点公里标,GLB 终点公里标');
          query1.sql.add('from '+ExtractFileName(opendialog1.FileName)+'');
          query1.sql.add('where xxlx="31" OR (BH=:BH1 and xxlx="83") or (GLB=:BH1 and xxlx="83")');   //查询车站信息或者数值且是区段限速类型
          query1.params[0].AsInteger:=strtoint(edit1.text);
          query1.prepare;
          query1.open;
          query1.Filtered:=false;
          DBgrid1.Columns[0].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[0].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[1].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[1].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[2].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[2].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[3].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[3].Alignment:=taCenter;//内容居中
          DBgrid1.Columns[4].Title.Alignment:=taCenter;//标题居中
          dbgrid1.Columns[4].Alignment:=taCenter;//内容居中
        end
    end;目前使用的代码,字段里面添加所有需要查的字段,然后查不同数据的时候删除多余字段,首次点击没问题,能查到。但再次点击就报错。query1.fields[7].Destroy;   //此行造成了报错,错误信息:query1:cannot perform this operation on an open dataset.删除多余字段,删除这条语句就没问题,请问如何解决呢?
      

  6.   

    query没有必要加字段上去的,都是自己加载的
      

  7.   


    最简单的方法, 在sql 查询中就处理了。
    比如將查询语句写成:select *, case [布尔字段] when 1 then '对' else '错' end as [布尔字段1]  from  tbl