想问高手一个问题!
大家在开发软件的时候,一个FORM 使用一个ADODataset 或 ADOQUERY 还是多个FORM共用一个ADODataset 或 ADOQUERY ? 
还是一个FORM 用一个 ADODataset 和 ADOQUERY , 或者  多个FORM 共用ADODataset 和 ADOQUERY 
adodataset用来更新,插入和删除,adoquery 用来查询?我这里碰到了个奇怪的问题!
我有个表里有10条记录,但ADODATASET.NEXT 却只能显示前2条记录,不管你再怎么点NEXT按钮,都没用. 除非点 最后一条记录按钮才能显示最后一条记录.如果红色的地方我用直接 DataModule1.dsadodp.open; 这个代替,那么就可以NEXT按钮就可以正常查询数据,但如果是通过输入一个单号查找记录后,就不行了.因为这时数据集里就一条数据了
(我是一个FORM,一个ADODATASET)
unit U_dpdj;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, Mask;  const sx_wmmessage = wm_user+100;
     er_message = wm_user+10001;
     info_message= wm_user+10002;type
  Tf_dpdj = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    dbcbbeq_num: TDBComboBox;
    lbl3: TLabel;
    dbcbbdp_type: TDBComboBox;
    lbl4: TLabel;
    dbcbbdp_dep: TDBComboBox;
    lbl5: TLabel;
    dbcbbdp_use: TDBComboBox;
    lbl6: TLabel;
    dbedtdp_date: TDBEdit;
    lbl7: TLabel;
    dbcbbdp_po: TDBComboBox;
    lbl8: TLabel;
    dbmmodp_re: TDBMemo;
    lbl9: TLabel;
    dbedtdp_num: TDBEdit;
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
     procedure sxwmmessage(var msg:TMessage); message sx_wmmessage;
     function connect(sql1:string):string;
     procedure lockbtn;
     procedure unlockbtn;
     procedure lockedit;
     procedure unlockedit;
     procedure autonum;
    { Private declarations }
  public    { Public declarations }
  end;var
  f_dpdj: Tf_dpdj;
  riqi,num:string;implementation
  uses u_main,dataconn,U_GJDJ;
{$R *.dfm}{自动编号}
procedure Tf_dpdj.autonum;
begin
  with DataModule1.qry2 do
  begin
    Close;
   SQL.Clear;
   SQL.Text:='select dp_id+1 as id from dpdjb order by dp_id desc';
   Open;
   {单据编号}
   riqi:=FormatDateTime('yyyymmdd',Date);
    num:=riqi+IntToStr(FieldValues['id']);
    end;
end;  {按钮锁}
procedure Tf_dpdj.lockbtn;
begin
   btn1.Enabled:=False;
   btn2.Enabled:=False;
end;procedure tF_DPDJ.unlockbtn;
begin
    btn1.Enabled:=true;
   btn2.Enabled:=True;
end;procedure Tf_dpdj.lockedit;
begin
  edt1.Visible:=False;
  dbedtdp_num.Visible:=True;
end;procedure Tf_dpdj.unlockedit;
begin
   edt1.Visible:=true;
  dbedtdp_num.Visible:=False;
end;   {连接函数}
function Tf_dpdj.connect(sql1:string):string;
begin
  DataModule1.dsadosdp.Active:=False;
  DataModule1.dsadosdp.Close;
  DataModule1.dsadosdp.Parameters.Clear;
  DataModule1.dsadosdp.CommandText:=sql1;
  DataModule1.dsadosdp.Parameters.ParseSQL(DataModule1.dsadosdp.CommandText,True);
   DataModule1.dsadosdp.Active:=True;
  DataModule1.dsadosdp.Open;
end;{工具栏按钮}
procedure Tf_dpdj.sxwmmessage(var msg:TMessage);
var sqstr:string;
begin
  sqstr:='select * from dpdjb';
  if msg.Msg = sx_wmmessage then
  begin
    if Self.Active = True then
    begin
    case msg.WParam  of
      1:
      begin
        unlockbtn;
        unlockedit;
        btn1.Enabled:=True;
        btn1.Caption:='查询';
        btn2.Caption:='删除';
        edt1.SetFocus;
        edt1.Text:='';
        DataModule1.dsadosdp.Close;
        f_mian.btn4.Enabled:=False;
        f_mian.btn6.Enabled:=True;
      end;
      2:
      begin
        unlockbtn;
        lockedit;
        autonum;
        DataModule1.dsadosdp.Open;
        DataModule1.dsadosdp.Insert;
        dbedtdp_num.Text:=num;
        dbedtdp_num.Enabled:=False;
        dbedtdp_date.Text:=DateToStr(Now);
        btn1.Caption:='添加';
        btn2.Caption:='退出';
        f_gjdj.locktools;
        f_mian.btn6.Enabled:=False;
        f_mian.btn4.Enabled:=True;
      end;
      3:   {第一条}
      begin
        lockedit;
        connect(sqstr);
        DataModule1.dsadosdp.First;
      end;
      4:      {下一条}
      begin
        lockedit;
        connect(sqstr);
        DataModule1.dsadosdp.Next;
      end;
      5:         {上一条}
      begin
        lockedit;
        connect(sqstr);
        DataModule1.dsadosdp.Prior;
      end;
      6:                  {最后一条}
      begin
        lockedit;
        connect(sqstr);
        DataModule1.dsadosdp.Last;
      end;
    end;
    end;  
  end;  
end;  
procedure Tf_dpdj.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.free;
f_gjdj.locktools;
end;procedure Tf_dpdj.FormCreate(Sender: TObject);
begin
  dbedtdp_date.Text:=DateToStr(Now);
with DataModule1.qry2 do
begin
   Close;
   SQL.Clear;
   SQL.Text:='select eq_num from cmper where eq_state=''正常'' ';
   Open;
   while not Eof do
   begin
       dbcbbeq_num.Items.Add(FieldValues['eq_num']);
       Next;
   end;
   Close;
   SQL.Clear;
   SQL.Text:='select  eq_use,eq_usedep,eq_type from cmper order by eq_usedep';
   Open;
   while not Eof do
   begin
     dbcbbdp_type.Items.Add(FieldValues['eq_type']);
     dbcbbdp_dep.Items.Add(FieldValues['eq_usedep']);
     dbcbbdp_use.Items.Add(FieldValues['eq_use']);
     dbcbbdp_po.Items.Add(FieldValues['eq_use']);
     Next;
   end;
end;
end;procedure Tf_dpdj.btn1Click(Sender: TObject);
var sqlstr:string;
begin
  sqlstr:='select * from dpdjb where dp_num='''+edt1.Text+'''';
if btn1.Caption = '查询' then
begin
if (edt1.Text='') then
begin
  PostMessage(f_mian.Handle,er_message,0,0);
  Exit;
end else
begin
  connect(sqlstr);
  lockedit;
  dbedtdp_num.ReadOnly:=True;
  f_gjdj.unlocktools;
  btn1.Enabled:=False;
end;
 Exit;
end;
if btn1.Caption = '添加'  then
 begin
if (dbcbbeq_num.Text='') or (dbcbbdp_type.Text='') or (dbcbbdp_dep.Text='') or
    (dbcbbdp_use.Text='') or (dbcbbdp_po.Text='') then
    begin
      PostMessage(f_mian.Handle,er_message,0,0);
    end else
begin
  DataModule1.con1.BeginTrans;
  try
    DataModule1.dsadosdp.UpdateBatch;
    PostMessage(f_mian.Handle,info_message,0,0);
    DataModule1.con1.CommitTrans;
    DataModule1.dsadosdp.Close;
    f_gjdj.unlocktools;
    except
      DataModule1.dsadosdp.CancelBatch;
       DataModule1.con1.RollbackTrans;
       PostMessage(f_gjdj.Handle,er_message,2,0);
       DataModule1.dsadosdp.Close;
       f_gjdj.unlocktools;
       end;  end;
end;
end;end.

解决方案 »

  1.   

    如果你数据源不变的话,只用一个连接,不要使用多个,adoquery可根据需要,如果单表访问就是用一个,如果多表并行访问可以使用多个
      

  2.   

    function Tf_dpdj.connect(sql1:string):string; 
    begin 
      DataModule1.dsadosdp.Active:=False; 
      DataModule1.dsadosdp.Close; 
      DataModule1.dsadosdp.Parameters.Clear; 
      DataModule1.dsadosdp.CommandText:=sql1; 
      DataModule1.dsadosdp.Parameters.ParseSQL(DataModule1.dsadosdp.CommandText,True); 
      DataModule1.dsadosdp.Active:=True; 
      DataModule1.dsadosdp.Open; 
    end; 你看这个是不是只要我更换了SQL1里的语句,再执行的话,就出来新的记录集是吗?为什么我更换了却NEXT 只能显示前2条记录,后面的都显示不出来啊!
      

  3.   

    设计好点是窗口UI与数据模块分开DataSet 与 Query置于 DataModule上显然 DataModule是公用的
      

  4.   

    connect(sqstr); 你执行这个函数的时候就重新获取数据集了获取数据集后默认当前记录是第一条记录你在下一条的时候不能执行这个函数,但是你要判断ADODataset或Query是否是Active的直接next就可以了上一条或者最后一条同理
      

  5.   

    那OPEN;以后也不是重新获取了数据集啊?
    OPEN 和 connect(sqstr); 
    执行到底有什么不同呢?谢谢!
      

  6.   

    connect(sqstr)按照你给的特定的SQL语句进行数据库操作。OPEN 是打开数据集 供其他控件 或 程序读取。
      

  7.   

    不是太明白!connect(sqstr) 这个是一个查询数据的一个函数,自己写的!
    里面也有OPEN;而ADODATASET.OPEN;
    也是打开数据数据集啊!