为什么调用后,关闭AdoQuery的时候会报错?错误信息如下:Bof或Eof有一个是"真",或者当前的记录已被删除,所需的操作要求一个当前的记录?????请尽量详细些,谢谢

解决方案 »

  1.   

    将你的代码在非DLL调用中调试一下,我想和你用不用DLL没有关系。不知你给DLL中传参数时是如何做的,最好只传字符。
      

  2.   

    DLL中的ADO连接不是从调用中传过来的,也就是说,没从调用程序中传递参数过来
      

  3.   


    和DLL没有关系,应是你对Query的操作错误将代码贴来看看。
    [email protected]
      

  4.   

    unit Enter;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls, Db, ADODB,Activex;type
      TEnterForm = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Edit1: TEdit;
        UpDown1: TUpDown;
        Edit2: TEdit;
        ComboBox1: TComboBox;
        Panel3: TPanel;
        Image1: TImage;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Edit6: TEdit;
        Edit7: TEdit;
        UpDown2: TUpDown;
        Edit8: TEdit;
        UpDown3: TUpDown;
        Edit9: TEdit;
        UpDown4: TUpDown;
        ComboBox2: TComboBox;
        Edit10: TEdit;
        ComboBox3: TComboBox;
        ComboBox4: TComboBox;
        Edit11: TEdit;
        Edit12: TEdit;
        Edit13: TEdit;
        Edit14: TEdit;
        Edit15: TEdit;
        Label1: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label7: TLabel;
        Label8: TLabel;
        Label9: TLabel;
        Memo1: TMemo;
        ADOC: TADOConnection;
        ADOQ: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure Edit2KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        LxhDw1:String;
        LxhDw2:Extended;
        LxhDw3:Integer;
        { Public declarations }
      end;
      function ShowEnter(AHandle: THandle; ACaption: String):BOOL; StdCall;
    var
      EnterForm: TEnterForm;implementation
    function ShowEnter(AHandle: THandle; ACaption: String):BOOL;
    var
     EnterForm : TEnterForm;
    begin
     Application.Handle := AHandle;
     EnterForm := TEnterForm.Create(Application);
     try
       EnterForm.Caption := ACaption;
       EnterForm.ShowModal;
       Result := False;
     finally
       EnterForm.Free;
     end;
    End;
    {$R *.DFM}
    procedure TEnterForm.FormCreate(Sender: TObject);
    Var
      Dbs:TextFile;
      Lxha: Array[1..5] Of String[40];
      I:Integer;
    begin
      Coinitialize(Nil);
      AssignFile(Dbs,'Dbset.ini');
      Reset(Dbs);
      I:=1;
      Try
        While (Not Eof(Dbs)) And (I<=5) Do
          Begin
            Readln(Dbs,Lxha[I]);
            I:=I+1;
          End;
      Finally
        CloseFile(Dbs);
      End;
      Try
        AdoC.ConnectionString:='Provider=SqlOledb.1;Persist Security Info=False;'+Lxha[2]+';'+Lxha[3]+';'+Lxha[4]+';'+Lxha[1];
        AdoC.Connected:=True;
      Except
        Application.MessageBox('与数据库连接断开,请检查!','一般性错误',Mb_Ok);
        Exit;
      End;
      Label8.Caption:='经办人:'+Lxha[5];
      With AdoQ Do
        Begin
          Close;
          Sql.Clear;
          Sql.Add('Select * From TabLxSz');
          Open;
        End;
      If Not AdoQ.IsEmpty Then
        Begin
          Label1.Caption:=AdoQ['Lx'];
          While Not AdoQ.Eof Do
            Begin
              ComboBox1.Items.Add(AdoQ['Lx']);
              AdoQ.Next;
            End;
          comboBox1.Text:=Label1.Caption;
          Label1.Caption:='';
        End
      Else
        Begin
          application.MessageBox('请先设置类型','一般性错误',Mb_Ok);
          Exit;
        End;
      With AdoQ Do
        Begin
          Active:=False;
          Close;
          Sql.Clear;
          Sql.Add('Select * From TabLxSz Where ');
          Sql.Add('Lx='''+ComboBox1.Text+'''');
          Open;
        End;
        Label1.Caption:=AdoQ['Dwmc'];
    end;procedure TEnterForm.Edit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      If Key = VK_RETURN  Then
        Begin
          Key  :=  Ord(0);
          Perform(WM_NEXTDLGCTL,0,0);
        End
    end;procedure TEnterForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      AdoQ.Sql.Clear;
      Adoc.connected:=False;
    end;end.
    //不管是过程中想关闭会报错,还有,FORM关闭的时候也报这个错,我想是与Adoquery关闭有关.//另有高手指点:在DLL的begin,end,中加上Coinitialize(nil); uses ActiveX;但我加了后编译正常,但还是会报错,是不是加错了地方?
      

  5.   

    procedure TEnterForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      AdoQ.close();//adoQ.active:=false; 
      AdoQ.Sql.Clear;
      Adoc.connected:=False;
    end;//如果动态创建的要动态删除对象
      

  6.   

    如果没有Coinitialize(nil);程序开始就会出错的;
    给DILPHI的ado打补丁了吗?
      

  7.   

    对了,这句在DLL的BEGIN END之间是不会出错的,这是我想加过来试试,没删除:(新问题又出现了,我用同样的方法再做了一个DLL,但没有出现问题?问题是不是出在表上?