三层问题?(100分)

  • 主题发起人 主题发起人 匪匪
  • 开始时间 开始时间

匪匪

Unregistered / Unconfirmed
GUEST, unregistred user!
我按照李维《分布式多层系统篇》中第5章无状态例子做的程序为什么有错。
代码如下所示:
var
。。。。
VOwnerData1:olevariant;
implementation
uses 。。。。;
function Tform_khzl.GetKeyField(Sender:TObject): OleVariant;
var
temp_bookmark:TBookmark;
begin
with dm_customer1do
begin
temp_bookmark:=ClientDataset1.GetBookmark;
ClientDataset1.Last;
result:=ClientDataset1.fieldbyname('编号').Value;////////////////////
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;
程序执行完Clientdataset1.Laset后出错,Clientdataset1:can't perform this operation on this closed dataset.
我的其它代码都是按照他书上写的。

More按钮(显示下一段数据)代码:
procedure Tform_khzl.SpeedButton2Click(Sender: TObject);
var
temp_bookmark:TBookmark;
bTrueEof:Boolean;
begin
//main.form_main.WS_customer.Edit(Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text,Edit5.Text,Edit6.Text,Edit7.Text);
bTrueEof:=false;
with dm_customer1do
if (not bTrueEof) then
begin
temp_bookmark:=Clientdataset1.getbookmark;
if Clientdataset1.GetNextPacket<Clientdataset1.PacketRecords then
bTrueEof:=true;
ClientDataset1.Last;
VOwnerData1:=Clientdataset1.FieldByName('编号').Value;
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.Next;
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;


procedure TDM_customer1.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
if (VarisEmpty(VOwnerData1)) or (VarisNull(VOwnerData1)) then
OwnerData:=form_khzl.GetKeyField(Sender);
OwnerData:=VOwnerData1;
end;
其它程序都没有错,就是在GetKeyField中有错
 
clientdataset没有Open
 
他可能在设计模式就Active了,你没有
 
to realLearning:
我的Clientdataset在设计时是打开的。即Active=true
在程序的什么地方打开呢
在Remotedatamodule中已经在datasetprovider的BeforeGetRecords中用打开了哟。
程序如下:
procedure TWS_customer.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
with Sender as TDatasetProviderdo
begin
Dataset.Open;
Dataset.Locate('编号',OwnerData,[]);
Dataset.Next;
end;
end;
 
ClientDataset1.open;
加上吧,加在最前面
 
to snjat:
function Tform_khzl.GetKeyField(Sender:TObject): OleVariant;
var
temp_bookmark:TBookmark;
begin
with dm_customer1do
begin
Clientdataset1.Open;////////////////////////////////////
temp_bookmark:=ClientDataset1.GetBookmark;
ClientDataset1.Last;
result:=ClientDataset1.fieldbyname('编号').Value;
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;
我加在有//////////的这一行有问题说stack flow好像说堆栈上溢呀。
加哪里呀。
 
估计你的clientdataset连接的数据集不对
李维给的程序错误确实不少
但这一段是没问题的
 
to 52free:
我如果用自动获取数据。则没有问题呀,你们实现无状态对象是如何实现的呀。
 
單純就錯誤提示來看,是你的ClientDataSet沒有打開. 而你又確認已打開,這就讓人不太明
白了. 中間層相應代碼寫了嗎?
 
function Tform_khzl.GetKeyField(Sender:TObject): OleVariant;
var
temp_bookmark:TBookmark;
begin
with dm_customer1do
begin
temp_bookmark:=ClientDataset1.GetBookmark;
ClientDataset1.Last;
[red]if ClientDataset1.active then
showmessage( 'active' );[/red]//在这判断一个是否关闭了
result:=ClientDataset1.fieldbyname('编号').Value;////////////////////
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;
程序执行完Clientdataset1.Laset后出错,Clientdataset1:can't perform this operation on this closed dataset.
我的其它代码都是按照他书上写的。
 
to smokingroom:
我的中间层代码打开了呀
在datasetprovider的BeforeGetRecords函数中已打开了,代码我在前面已显示出来了呀
问题究竟出在哪里呀,你们快来救我呀
我现在将代码全贴出来呀
客户端主要代码
unit khzl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, Buttons, ComCtrls, DBCtrls,db;
type
Tform_khzl = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
SpeedButton9: TSpeedButton;
SpeedButton1: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
Panel1: TPanel;
CheckBox1: TCheckBox;
SpeedButton2: TSpeedButton;
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton8Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpeedButton9Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
private
{ Private declarations }
public
function GetKeyField(Sender:TObject):OleVariant;
{ Public declarations }
end;

var
form_khzl: Tform_khzl;
VOwnerData1:olevariant;
implementation
uses main,dm_customer, khzl_tj;
{$R *.dfm}
procedure Tform_khzl.SpeedButton2Click(Sender: TObject);
var
temp_bookmark:TBookmark;
bTrueEof:Boolean;
begin
//main.form_main.WS_customer.Edit(Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text,Edit5.Text,Edit6.Text,Edit7.Text);
bTrueEof:=false;
with dm_customer1do
if (not bTrueEof) then
begin
temp_bookmark:=Clientdataset1.getbookmark;
if Clientdataset1.GetNextPacket<Clientdataset1.PacketRecords then
bTrueEof:=true;
ClientDataset1.Last;
VOwnerData1:=Clientdataset1.FieldByName('编号').Value;
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.Next;
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;

function Tform_khzl.GetKeyField(Sender:TObject): OleVariant;
var
temp_bookmark:TBookmark;
begin
with dm_customer1do
begin
Clientdataset1.Open;
temp_bookmark:=ClientDataset1.GetBookmark;
ClientDataset1.Last;
result:=ClientDataset1.fieldbyname('编号').Value;
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;

中间层代码如下:
procedure TWS_customer.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
with Sender as TDatasetProviderdo
begin
Dataset.Open;
Dataset.Locate('编号',OwnerData,[]);
Dataset.Next;
end;
end;
 
to WorldCreater:
我加了,但还是那个错误。
代码是执行到ClientDataset1.Last后出错的。
 
ClientDataset1.Last后加代码判断,确认是打开的了吗?
数据库是用ado连接吗?打了补丁没有?
 
建議你把ClientDataSet刪掉,換一個試試看.
 
to WorldCreater:
我在clientdataset1.last后加代码程序还是那个错误,看来是执行这条语句时出的错
所以我加在clientdataset1.last 前面了。但是程序没有出对话框。我用调试模式也没有出对话框。程序直接跳过了。
 
to all:
我用的是BDE连接
 
加上以下代碼試試看.
procedure TWS_customer.FormCreate(Sender: TObject);
begin
ClientDataSet1.Open;
end;
procedure TWS_customer.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
ShowMessage('Will Close');
Abort;
//不讓關閉.
end;
 
to smokingroom, WorldCreater:
我把原来的ClientDataset删除了,可以用了程序没有出错
但我点击按钮(取下一段数据)时没有按照规则取数据
即程序第一次显示时,显示的是从第2到第11,我的packetrecords为10呀,应从第1到10呀还有我点击按钮后,显示的数据还是从2到11,而且可以永久点下去,显示的数据还是从2到11呀。
 
沒有出錯就好辦了.
1.確認你的數據到底有多少.
2.確認你的GetKeyField有沒有返回值,正不正確.
3.增加ClientDataSet1.BeforeGetRecords事件,將VOwnerData1送到中間層.
procedure TWS_customer.ClientDataSet1BeforeGetRecords(Sender:TObject;var OwnerData: OleVariant);
begin
OwnerData:=vOwnerData1;
end;
另外,要確認你的clintDataSet和DataSetProvider的相關屬性要設好.
 
to smokingroom:
1)我的代码有条,应点击MORE...按钮两次才能显示完。
2)GetKeyField有返回值代码如下:
function Tform_khzl.GetKeyField(Sender:TObject): OleVariant;
var
temp_bookmark:TBookmark;
begin
with dm_customer1do
begin
temp_bookmark:=ClientDataset1.GetBookmark;
ClientDataset1.Last;
result:=ClientDataset1.fieldbyname('编号').Value;
ClientDataset1.GotoBookmark(temp_bookmark);
ClientDataset1.FreeBookmark(temp_bookmark);
end;
end;

3)procedure TDM_customer1.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
if (VarisEmpty(VOwnerData1)) or (VarisNull(VOwnerData1)) then
OwnerData:=form_khzl.GetKeyField(Sender);
OwnerData:=VOwnerData1;
end;
对于3)在李维的书中代码如上所示。它先判断了一个VOwnerData1看是否为空。我想可能是我的VOwnerData1没有传给中间层。我再试一下。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
564
import
I
后退
顶部