有两个问题想请教各位,多谢了!(200分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
关于三层的问题
第一个问题:
是关于主从表的问题,比如主表如下:
dbo.master
id name
1 A
2 B
从表如下(字段bid是自增字段,id是与主表id关联的):
dbo.detail
did id price
1 1 12
2 1 14
3 2 15
我看了李维的书,他说是用巢状式来解决,我也试过一下,但发现一个问
题:
比如用ClientdataMaster(Tclientdataset,ClientdataMaster是主
表),当ClientDataMaster.insert,再添加主从表的数据,然后
Clientdatamaster.Applyupdates(0),出现错误:“从表dbo.detail的
did不能修改”。如果我把bid去掉自增类型,改为int,这样就不会出现错
误了,可以成功提交到数据库。如何解决这个问题?(保留自增字段)
我想请教各位用巢状式解决主从表好不好?有没有更好的方法?能不能举一
个例子来,当然最好给一个Demo给我。(是用ADO访问数据库)
第二个问题:
三层分为表现层、业务层和数据库层,象上面的例子,如果在前端用
CinentdataMaster.insert,添加一些数据,如果提交数据就
Clientdatamaster.Applyupdates(0),
这样做是不是真正三层结构?如果要提交数据是不是在中间写提交代码,而
不是在前端提交?能不能举一个例子,比如只提交单表(dbo.table1),也
最好给一个Demo来。(是用ADO访问数据库)
数据库是Sql server 7,中间用Ado访问数据库,Madias的Dll类型服务
器。
 
能否这样实现在前端添加数据,如果保存则在中间提交数据,请问如何写代码?中间是用
Ado连接sql server 7的。
 
还是没有人理?
 
例子我就不给你了,举个例子如下
常用的业务做到中间层,只提供接口函数:Appserver.Dabian(WC, WhoName: WideString)
你不用管谁冲水,手纸从哪来。
一些不定的需求,可以动态取得,现在DELPHI5可以用CLIENTDATASET。COMMANDTEXT := 。。。
有一种说法:少用存储过程,试图,即数据库是透明的(可变的),我不太认同。
要发版了,累、烦。不好意思,心情不好。
 
在中间层,我在*.Tlb定义一个函数:
function TAppServer3.ApplyMasterData(Delta: OleVariant;
MaxError: Integer;
var ErrorCode: Integer): OleVariant;
begin
Result:=ProviderMaster.ApplyUpdates(Delta,MaxError,ErrorCode);
//ProviderMaster(TDataSetProvider)
end;

在中间添加Tadoconnection,Datasetmaster(TAdoDataSet)和
ProviderMaster(TDataSetProvider),ProviderMaster的Dataset连接DatasetMaster,
DataSetmaster的commandtext:='select * from master'
在前端:
添加TDCOMConnection和cdsMaster(TClientDataset),其属性ProviderName为
ProviderMaster,当我添加数据时,则:
cdsmaster.insert;
如果提交数据则:
procedure TForm1.Button2Click(Sender: TObject);
var
IMida :IAppServer3;
iRecord:Integer;
begin
IMida.ApplyMasterData(cdsMaster.Delta,0,iRecord);
end;

运行时,添加数据一些数据,然后按button2提交数据时,出现错误:
Project PClient.exe raised exception class EAccessViolation with message'Acess
violation at address 004AF185 in module 'PClient.exe'.Read of address 00000000'.
Process stopped.Use Step or Run to continue.
请问如何改?我这样做提交数据行不行?
 
三层中我一般不使用自动类型,如果实在要用的话, 不要使用自动提交,自己写吧。
 
我上面的是自动提交,如果不用自动提交,那怎么写代码?
 
再问另一个问题:
在中间层添加adoDataset1(TadoDataset)和datasetProvider1(TdatasetProvider),
其中datasetProvider1的Dataset属性为空。我想在前端的edit1.text填写一个参数,让中
间的datasetProvider1的属性DataSet=adodataset1。比如我在edit1.text里填写:
adodataset1,则中间的datasetProvider1的属性DataSet=adodataset1。
但有一个问题,我在中间写一个接口,但不知用何种类型,比如接口如下:
function TActServer.ApplyData(var DBDataset: OleVariant): OleVariant;
begin
ProviderBase.Dataset:=DbDataset;
end;

但这个肯定会出错,原因是TdataSet和OleVariant相矛盾,其实我知道肯定会错,
但不知道DBDataset用何种类型?在添加Method时,根本没有Tdataset类型让你选的,
请问如何做?
 
请帮帮忙!
 
传名字(字符串),然后查找所有的dataset的名字,对比看哪个是
for i:=0 to database.DatsetCount-1do
if UpperCase(database.DataSet.Name)=UpperCse(我要的那个名字) then
ProviderBase.Dataset:=database.DataSet
 
fstao:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
请教:用的时Adoconnection可以用你的方法吗?(database.datsetcount)

(传名字(字符串),然后查找所有的dataset的名字,对比看哪个是
for i:=0 to database.DatsetCount-1do
if UpperCase(database.DataSet.Name)=UpperCse(我要的那个名字) then
ProviderBase.Dataset:=database.DataSet)
 
后退
顶部