一个DLL中带FORM,带ADO连接的问题,请不吝赐教(在线等待) 为什么调用后,关闭AdoQuery的时候会报错?错误信息如下:Bof或Eof有一个是"真",或者当前的记录已被删除,所需的操作要求一个当前的记录?????请尽量详细些,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将你的代码在非DLL调用中调试一下,我想和你用不用DLL没有关系。不知你给DLL中传参数时是如何做的,最好只传字符。 DLL中的ADO连接不是从调用中传过来的,也就是说,没从调用程序中传递参数过来 和DLL没有关系,应是你对Query的操作错误将代码贴来看看。[email protected] 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;implementationfunction 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); Endend;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;但我加了后编译正常,但还是会报错,是不是加错了地方? procedure TEnterForm.FormClose(Sender: TObject; var Action: TCloseAction);begin AdoQ.close();//adoQ.active:=false; AdoQ.Sql.Clear; Adoc.connected:=False;end;//如果动态创建的要动态删除对象 如果没有Coinitialize(nil);程序开始就会出错的;给DILPHI的ado打补丁了吗? 对了,这句在DLL的BEGIN END之间是不会出错的,这是我想加过来试试,没删除:(新问题又出现了,我用同样的方法再做了一个DLL,但没有出现问题?问题是不是出在表上? 非常郁闷的问题(算法类),分不够再加 软件测试需要做什么工作,有没有相关的软件? 如何往TreeView1.Items[2].Data中存入和取出一个整数? 日期和数型问题 能求教你一个问题,感谢 半于控件的一个小问题! 如何给运行中生成节点的treeview控件加图标????? 程序中怎样用word来编辑文本 关于TStringList? 如何解决闪烁问题! 获取和设置本机 ip 地址的api函数? QReport打印偏移量的调整问题
和DLL没有关系,应是你对Query的操作错误将代码贴来看看。
[email protected]
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;但我加了后编译正常,但还是会报错,是不是加错了地方?
begin
AdoQ.close();//adoQ.active:=false;
AdoQ.Sql.Clear;
Adoc.connected:=False;
end;//如果动态创建的要动态删除对象
给DILPHI的ado打补丁了吗?