字段多了,还是用TABLE的好。

解决方案 »

  1.   

    俺喜欢用query,比较自由。
    不过这么多的字段,恐怕用table还是简单一点的。
      

  2.   

    我觉得BDE的Table1比Query1快,
    所以我总是用Table
      

  3.   

    如果是显示的话,何必用query+edit呢?用table+dbgrid很快又方便!只要不是直接增删改用数据感知控件很方便的,即使要增删改也可以另做窗体操作,dbgrid只起定位作用行了!
    至于速度,我认为还是table+dbgrid快一些!毕竟dbgrid比较专业一些!具体没试过。
    其实你的记录并不多,我试过一百多万条记录的,可以分批显示,就像sqlserver中的分析器一样的效果!
      

  4.   

    2000条记录不多。还是用table吧。
      

  5.   

    { 从数据库把那些常用的字段导入ComboBox.Items,ListItem.Items...等Strings中 }
    procedure FillItemsFromDB(ATableName,AFieldName,sqlWhere:string;
      Distinct:Boolean ;Items:TStrings);overload;procedure FillItemsFromDB(ATableName,AFieldName,sqlWhere:string;
      Distinct:Boolean;Items:TStrings);
    var
      vSql,vFieldName,vItem:string;
      P:Integer;
    const
      c_strArr_Distinct:array[Boolean]of string=('','DISTINCT');
    begin
      P:=0; Items.BeginUpdate ;
      try
      if Items.Count>0 then Items.Clear ;    vFieldName:=AFieldName;
        P:=pos('=',AFieldName);
        if P>0 then
          vFieldName[P]:=',';    vsql:=UpperCase(Format('SELECT %s %s FROM %s %s',
            [c_strArr_Distinct[Distinct],
             vFieldName,
             ATableName,
             sqlWhere]));    with DM_Main.qryCommonUse do
        begin
          Close;
          Sql.CLear;
          Sql.Text:=vSql;
          Open;
          //if not Bof then First;
          while not EOF do
          begin
            if P>0 then
              vItem:=Format('%s=%s',
                [VarToStr(Fields[0].Value),
                 VarToStr(Fields[1].Value)])
            else
              vItem:=VarToStr(Fields[0].Value);        if vItem<>'' then
              Items.Add(vItem);        Next ;
          end;
        end;//end of with DM_Main.qryCommonUse
      finally
        Items.EndUpdate ;
      end;
    end;
      

  6.   

    不好意思,弄错了!
    应该这样:定义一个variant变量,把所有edit的值依顺序存到variant变量中,我们用
    的是存储过程,保存的时候只需把variant的值赋给存储过程的参数即可,如果用query也一样,只要把值传过去就行!
      

  7.   

    如果只是显示所有记录,当然用Table,如果有条件显示部分记录,建议用Query,查询比过滤块多了。Query也可配合感知元件的,用法同Table.
      

  8.   

    谢谢大家,在菜鸟的眼里,2000条记录可是很多很多的了,所以在为这个烦恼。我的这东西不好用dbgrid,因为有它自己的格式,中国的表格,没规律可找 的那种。谢谢yicw(无奈) 的代码。
    最后还有一个小问题:是把所有的页面(就是主FORM和其它的FORM1,FORM2,FORM3....FORM比较多的)都做到一个EXE中去好呢,还是做成多个EXE,在主程序中用api调用的好?都做到一块觉得程序大了许多,还 是多做几个调用的占内存小,但好多软件都是做到一块的,它们是如何处理的?是用CREATE吗?
      

  9.   

    你可以通过 SQL MONITOR 可以看到具体的过程
    TABLE是将整个表打开后在进行FILTER
    QUERY是直接将SQL语句发送给数据库
    所以数据多的化,可以用QUERY查询较快,但TABLE很方便,
    2000条,无所谓用什么了!!!
      

  10.   

    dhl2001(我爱benz)说的好,虽然我没有做过,听我的同学说许多程序时这样处理的,占用内存少,运行速度快(菜鸟之言)
      

  11.   

    动态创建的时候有一点不明白,可不可以我先把各个FORM都做出来,设置一下不编译,不用FORM X.SHOWMODEL;而是用CREATE来调出该页面?好象看过类似的资料,是在project option中把这些页面从 “默认的创建窗口”(AUTO ...) 中放到“可供使用的窗口”(AVAILABLE FORM)这一项中去,然后用CREATE去创建,这样的效果又是如何?动态建立的窗口又是如何释放的?是用FORM X.CAFREE还是FORM X.FREE?X是指页面的编号,如1、2、、3等。分不够再加,请大家帮忙。
      

  12.   

    我觉得一般的话是在相应的窗体单元中加一个可以被其他单元调用的全局函数
    ,此函数用于动态创建,用TFROM_X.create,在ShowModal,然后FORM_X.FREE
      

  13.   

    根据国外的文档和我个人的使用经验,我觉得Query好一些。
    如果要更改数据的话,可以把Query的RequestLive改为True.
    至于字段多的问题,我觉得可以使用字符数组常量来解决。
      

  14.   

    我也曾经遇到过类似的问题,不过比你的问题还要复杂,可以说一切都是动态的,包括数据库结构是动态创建的,数量也是动态的,也就是说字段不一定,于是输入数据的编辑框也是动态的,浏览数据的界面也是动态的,其中还包括数据的分类,所以分类树也是动态的,需要根据所选的分类树结点进行动态查询,当然SQL语句也是动态的,有些字段在输入的时候是由程序自动生成的值,也就是不让用户来输入,有些字段浏览的时候是不让用户浏览的,用Table?哪行呀?只能用Query!
      

  15.   

    链表的定义如下:
    type
      FieldRecord=record
                    TabOrder:Integer;
                    FieldNob:Integer;        //字段记录号;
                    Caption:string;         //字段中文名(用于标签的显示);
                    FieldName:string;       //字段英文名(用于生成SQL语句);
                    FieldLength:integer;     //字段长度;
                    AllowEmpty:Boolean;     //是否允许为空;
                    DefaultValue:string;    //默认值;
                    UseDataDictionary:Boolean;   //是否使用数据字典;
                    DataDictionaryCreated:Boolean;   //数据字典是否建立;
                    Edit:TObject;
                    TextLabel:TLabel;
                    case FieldType:DataType of
                      varchar:();
                      datetime:();
                      text1:();
                      numeric:(
                               FieldPrecision:Word;
                               FieldDimensions:Word;
                              )
                  end;
      NextNode=^Node;
      Node=record
              Data:FieldRecord;
              Next:NextNode;
           end;
      Link=NextNode;
      

  16.   

    其中
      DataType=(varchar,numeric,datetime,text1);  //数据的四种类型
    下面是界面生成和SQL语句(只是插入时所用的SQL语句)生成部分,
    var
      MainRecord,PrimaryRecord:Link;
      TempNode1,TempNode2:NextNode;
    __________________________________________________________________
      MainQuery.Close;
      SQLStr:='insert into by_lrku (';            //初始化SQL添加字符串
      MainQuery.SQL.Clear;
      MainQuery.SQL.Add('select zdh,zdzwm,zdywm,zdlx,zdcd,'+
                        'zdjqd,zdgm,sfyxwk,mrz,sfsjzd,'+
                        'sfjlsjzd,editleft,edittop,editwidth,'+
                        'editheight,labelleft,labeltop,lrsx,'+
                        'labelwidth,labelheight from byk_jg '+
                        'where bj=0 and sflrzd=1 and kuleibie=''主库'' order by lrsx ASC' );     //从标引库结构表中读取字段信息;
      try
        New(MainRecord);
        MainRecord^.Next:=nil;
        TempNode1:=MainRecord;
        MainQuery.Open;
        MainQuery.First;
        if MainQuery.Eof then
        begin
          if MessageDlg('库结构尚未建立!请您先建立库结构再运行本程序'+
                         #13#13+
                         '        按OK按钮关闭本程序',mtWarning,[mbOK],0)=mrOK then
            Application.Terminate;
        end;
        while not MainQuery.Eof do
        begin
          New(TempNode2);
          with TempNode2^.Data do
          begin
            TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
            FieldNob:=MainQuery.FieldByName('zdh').AsInteger;
            Caption:=MainQuery.FieldByName('zdzwm').AsString;
            FieldName:=MainQuery.FieldByName('zdywm').AsString;
            SQLStr:=SQLStr+FieldName+',';
            if MainQuery.FieldByName('zdlx').AsString='varchar' then
              FieldType:=varchar
            else
            if MainQuery.FieldByName('zdlx').AsString='numeric' then
              FieldType:=numeric
            else
            if MainQuery.FieldByName('zdlx').AsString='datetime' then
              FieldType:=datetime
            else
            if MainQuery.FieldByName('zdlx').AsString='text' then
              FieldType:=text1;
            case FieldType of
              varchar,datetime:FieldLength:=MainQuery.FieldByName('zdcd').AsInteger;
              text1,numeric:;
            end;
            AllowEmpty:=MainQuery.FieldByName('sfyxwk').AsString='1';
            DefaultValue:=MainQuery.FieldByName('mrz').AsString;
            UseDataDictionary:=MainQuery.FieldByName('sfsjzd').AsString='1';
            DataDictionaryCreated:=MainQuery.FieldByName('sfjlsjzd').AsString='1';
            TextLabel:=TLabel.Create(Main);
            TextLabel.Caption:=Caption;
            TextLabel.Parent:=Main.InputBox;
            TextLabel.Top:=MainQuery.FieldByName('labeltop').AsInteger;
            TextLabel.Left:=MainQuery.FieldByName('labelleft').AsInteger;
            if UseDataDictionary and (not DataDictionaryCreated) then
            begin
              if MessageDlg('数据字典尚未建立,请先建立数据字典再运行本程序!'+#13#13+
                            '           请按OK按钮关闭本程序',mtError,[mbOK],0)=mrOK then
                Application.Terminate;
            end
            else
            if UseDataDictionary then
            begin
              Edit:=TComboBox.Create(Main);
              (Edit as TComboBox).Parent:=Main.InputBox;
              (Edit as TComboBox).Left:=MainQuery.FieldByName('editleft').AsInteger;
              (Edit As TComboBox).Top:=MainQuery.FieldByName('edittop').AsInteger;
              (Edit as TComboBox).OnKeyDown:=Main.EditKeyDown;
              (Edit as TComboBox).OnKeyPress:=Main.ComboBoxKeyPress;
              (Edit as TComboBox).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
              DDQuery.SQL.Clear;
              DDQuery.SQL.Add(Format('select sjxm from sjzdb where zdh=%d',[FieldNob]));
              try
                DDQuery.Open;
                DDQuery.First;
                while not DDQuery.Eof do
                begin
                  (Edit as TComboBox).Items.Add(DDQuery.FieldByName('sjxm').AsString);
                  DDQuery.Next;
                end;
                DDQuery.Close;
              except
                if MessageDlg('提取数据字典时发生错误!是否继续?',mtError,[mbYes,mbNo],0)<>mrNo then
                  Application.Terminate;
              end;
            end
            else
              case FieldType of
                varchar:begin
                          Edit:=TEdit.Create(Main);
                          (Edit as TEdit).Parent:=Main.InputBox;
                          (Edit as TEdit).Left:=MainQuery.FieldByName('editleft').AsInteger;
                          (Edit As TEdit).Top:=MainQuery.FieldByName('edittop').AsInteger;
                          (Edit As TEdit).Width:=MainQuery.FieldByName('editwidth').AsInteger;
                          (Edit As TEdit).height:=MainQuery.FieldByName('editheight').AsInteger;
                          (Edit as TEdit).OnKeyDown:=Main.EditKeyDown;
                          (Edit as TEdit).OnKeyPress:=Main.EditKeyPress;
                          (Edit as TEdit).OnExit:=Main.TEditExit;
                          (Edit as TEdit).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
                        end;
                numeric:begin
                          Edit:=TEdit.Create(Main);
                          (Edit as TEdit).Parent:=Main.InputBox;
                          (Edit as TEdit).Left:=MainQuery.FieldByName('editleft').AsInteger;
                          (Edit As TEdit).Top:=MainQuery.FieldByName('edittop').AsInteger;
                          (Edit As TEdit).Width:=MainQuery.FieldByName('editwidth').AsInteger;
                          (Edit As TEdit).height:=MainQuery.FieldByName('editheight').AsInteger;
                          (Edit as TEdit).OnKeyDown:=Main.EditKeyDown;
                          (Edit as TEdit).OnKeyPress:=Main.EditKeyPress;
                          (Edit as TEdit).OnExit:=Main.TEditExit;
                          (Edit as TEdit).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
                          FieldPrecision:=MainQuery.FieldByName('zdjqd').AsInteger;
                          FieldDimensions:=MainQuery.FieldByName('zdgm').AsInteger;
                        end;
                datetime:begin
                          Edit:=TDateTimePicker.Create(Main);
                          (Edit as TDateTimePicker).Parent:=Main.InputBox;
                          (Edit as TDateTimePicker).Left:=MainQuery.FieldByName('editleft').AsInteger;
                          (Edit As TDateTimePicker).Top:=MainQuery.FieldByName('edittop').AsInteger;
                          (Edit as TDateTimePicker).OnKeyDown:=Main.EditKeyDown;
                          (Edit as TDateTimePicker).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
                          (Edit as TDateTimePicker).DateFormat:=dfLong;
                         end;
                text1:begin
                       Edit:=TMemo.Create(Main);
                       (Edit as TMemo).Parent:=Main.InputBox;
                       (Edit as TMemo).Left:=MainQuery.FieldByName('editleft').AsInteger;
                       (Edit As TMemo).Top:=MainQuery.FieldByName('edittop').AsInteger;
                       (Edit As TMemo).Width:=MainQuery.FieldByName('editwidth').AsInteger;
                       (Edit As TMemo).height:=MainQuery.FieldByName('editheight').AsInteger;
                       (Edit as TMemo).TabOrder:=MainQuery.FieldByName('lrsx').AsInteger;
                       (Edit as TMemo).ScrollBars:=ssVertical;
                    end;
              end;
            TempNode2^.Next:=TempNode1^.Next;
            TempNode1^.Next:=TempNode2;
            TempNode1:=TempNode2;
            MainQuery.Next;
          end;
        end;
      

  17.   

    likegigi(李柯) :还好我这问题还没你的复杂,不然的话以我的水平会吐血的。
    如果有2000个人的资料,一人一张表,用什么数据库好?
    动态创建的时候有一点不明白,可不可以我先把各个FORM都做出来,设置一下不编译,不用FORM X.SHOWMODEL;而是用CREATE来调出该页面?好象看过类似的资料,是在project option中把这些页面从 “默认的创建窗口”(AUTO ...) 中放到“可供使用的窗口”(AVAILABLE FORM)这一项中去,然后用CREATE去创建,这样的效果又是如何?动态建立的窗口又是如何释放的?是用FORM X.CAFREE还是FORM X.FREE?X是指页面的编号,如1、2、、3等。分不够再加,请大家帮忙。 
      

  18.   

    手动创建的窗体与自动创建的窗体在功能上相同;
    但手动创建的窗体好处是可以手动释放(释放可以用FREE,DESDROY);
      

  19.   

      你将一个FORM加入到PROJECT的时候,PROJECT的SOURCE文件(Project->View Source)会自动创建这个FORM,也就是你在project option中“默认的创建窗口”(AUTO ...) 中会看到这个FORM,如果你在SOURCE文件中把某个FORM的CREATE去掉,也就相当于在project option把这个FORM从 “默认的创建窗口”(AUTO ...) 中放到“可供使用的窗口”(AVAILABLE FORM)这一项中去.也就是说,程序为你创建的FORM在默认的创建窗口”(AUTO ...) 中, 而(AVAILABLE FORM)这一项中的FORM是没有创建的.如果你直接用这里面的FORM会出地址错误.所以这些FORM用之前都要自己手动创建(CREATE),至于你想SHOW或是HIDE或是SHOWMODAL则随你的需要了.还有一点是对于MDICHILD   FORM 不用SHOW,只要CREATE就会"SHOW"出来.
      比如一般的FORM手动创建可以这样写:  with TFormX.Create(self) do
         try 
           showmodal;
         finally 
           free; //释放FORM
         end; MDI CHILD form的建立可以这样写:
      if not assigned(frmXX) then
        frmXX:= TfrmXX.Create(self)
      else frmXX.BringToFront; 
      但是记住一定关闭的时候要释放.
      
      

  20.   

    谢谢seewell(草原之子),我说的就是这回事。
      

  21.   

    比如一般的FORM手动创建可以这样写:  with Form2.Create(self) do
        try 
          showmodal;
        finally 
          free; //释放FORM
        end;
    这样子也还是出现了地址错误是什么原因?
      

  22.   

    请问wanwangzhiwang(万王之王),如何解决数据分批显示的问题? 
    我在程序中查询数据时,当数据量很大(超过一万条记录)时,数据无法显示出来。请问该如何解决这个问题?怎样可以分批显示?
    我用的是bde、tquery和 dbgrid。
    不胜感谢!
      

  23.   

    to chenjiong:
    创建时:if form2=nil then form2.create(self);
           from2.show;
    在窗体的close里写:
          action:=cafree;
          from2:=nil;
    这样就不会有地址错误了
      

  24.   

    我以前用的是ADO,看了一下tquery,好像不行,让我再想想!
      

  25.   

    创建的问题已经解决了,但在释放窗口的时候,除了在form2.onclose中加入action:=cafree外,另外我还用了一个按纽来关闭窗口,在此按纽的事件中是否也要加入
    procedure TForm2.Button1Click(Sender: TObject);
    var action:tcloseaction;
    begin
    action:=cafree;
    close;
    end;呢?请回答,然后就结帐了。
      

  26.   

    菜鸟的笨问题,请大家帮帮忙,创建的问题已经解决了,但在释放窗口的时候,除了在form2.onclose中加入action:=cafree外,另外我还用了一个按纽来关闭窗口,在此按纽的事件中是否也要加入
    procedure TForm2.Button1Click(Sender: TObject);
    var action:tcloseaction;
    begin
    action:=cafree;
    close;
    end;呢?请回答,然后就结帐了。