中国UML论坛

播种机

整理:mouri

0==========
原文(nbmoon于2001/05/14 05:38粘贴) 
难题请教,我在3层结构(VC做数据服务层)中,有一组数据库记录要更新,我可以用recordset 
--------------------------------------------------------------------------------
吗?我知道如果是连接的recordset,可以用addnew或者edit方法,然后用update更新。 
但是断开的recordset,可以在object model中用addnew,或者设置editmode为更改模式,然后传送整个更改后的recordset给数据服务层的modify函数(不用安全数组方法),然后在服务层modify函数中间用recordset的update更新吗? 
我知道单个纪录可以直接传参数给modify来更新数据库,但是多条纪录参数怎么一次传给modify, 
抱歉,大概有的地方说的不准确。 
还有看的Rose越多觉得他包含的东西越多啊。 
谢谢 

1==========
原文(kinsing于2001/05/14 08:41粘贴) 
回复: 难题请教,我在3层结构(VC做数据服务层)中,有一组数据库记录要更新,我可以用recordset 
--------------------------------------------------------------------------------
不好意思,不太懂你的意思。何为连接的recordset和断开的recordset. 
而且感觉好像你分层并没有分开啊.... 

11==========
原文(nbmoon于2001/05/14 13:45粘贴) 
KINSING我的程序是这样的: 
--------------------------------------------------------------------------------
在表示层分成USER INTERFACE和OBJECT MODEL.例如一个CUSTOMER,OM调用DATA SERVE LAYER的SEARCHCUSTOMER得到CUSTOMER的RECORDSET,然后OM返回给UI调用的数据, 在UI输入数据,调用OM的CUSTOMER对象的PUT方法更新,OM调用数据服务层的UPDATE更新数据库(传送参数给UPDATE). 
我这样更新一条纪录可以,但是多条纪录不能把每一个纪录的参数传递DATA SERVER LAYER. 
在N-TIER的结构中可以使用不连接数据库的RECORDSET(只要设定游标类型就可以了),我想改变一下UPDATE函数,在OM层直接传输更新过的RECORDSET给DATA LAYERDE的UPDATE,但是我不确定更新过的RECORDSET怎么在DATA LAYE更新数据库,是否要一条条取出纪录用SQL语句更新呢? 
我的OM是这样的:例如CUSTOMER对象的NAME属性 
OM有接口GET_NAME提供给UI数据,UI调用OM接口的PUT_NAME更新CUSTOMER对象. 
另外OM有CUSTOMERS对象负责管理CUSTOMER纪录集 
CUSTOMER对象包含SEARCHBYNAME等传送条件给DATA SERVE LAYER的SEARCHCUSTBYNAME,取得符合条件的RECORDSET. 
简单的说CUSTOMER提供属性,查找纪录集,CUSTOEMRS管理纪录集 
在更新一条纪录时候,可以用CUSTOMER传输每个参数给DATA LAYER, 
UI调用CUSTOMER,CUSTOMERS的接口指针得到纪录和更新纪录 
但是在更新ORDERDETAILS这样的多条纪录就不可以了. 
应该怎么办?我的方法好吗? 
如果我还没说清楚,我晚上贴一部分程序,加说明.好了,我上课去了.谢谢 

111==========
原文(nbmoon于2001/05/14 13:48粘贴) 
回复: 另外我的ICQ 
--------------------------------------------------------------------------------
36352861, thanks for your help. 

112==========
原文(kinsing于2001/05/14 14:30粘贴) 
回复: KINSING我的程序是这样的: 
--------------------------------------------------------------------------------
我的一点看法: 
分层是一种比较好的软件结构,但层之间的interface要简单。分层要考虑对于一个进程内的多个层次能否方便的被拆开。如果interface过于复杂,那个层与层之间的依赖关系就会太复杂,可能起不到分层的目的。 
我倾向的做法是: 
recordset是和具体的table相关的,实际应该属于数据层,数据层应该提供一个单独的对象来实现数据管理,比如PersistentService ,它提供连接DB和维护连接的能力和数据存储的能力。 
再者数据层并不是说一定要采用数据库,如果将来要求你将数据保存到本地文件中,那么的你的custormer对象是否还要保留另外的一个对象来实现这个功能,因为recordset不能提供保存到文件中的能力。 
但这些都可以由DB层提供的服务层来实现,PersistentService通过内部的recoresets将来实现数据存储,但对于OM层提供的接口是pure logical,不声明是保存在DB还是文件,但内部实现的时候按照要求你所需要的。 
对于提交多条记录,只要给PersistentService的参数中用数组或者链表都可以保存多个业务对象,致于DB层内部让PersistentService调用相关的recordset就可以了。 

1121==========
原文(nbmoon于2001/05/14 20:14粘贴) 
谢谢kinsing, 我的结构是这样的. 
--------------------------------------------------------------------------------
client 有UI + OM, data serve 只有一层,然后是数据库 
我把对象放在OM中, data serve是与Table无关的, 
每次OM传送recordset给data serve, data serve传送_recordsetptr给OM 
附带传送table name,这样加入新的table只要更改OM的对象和UI, 
一般不改变Data serve layer, 除非加入新的动作,如search, update等等 
如果要存储在本地,只要改变OM就可以了 
这样好吗? 
不过有些技术问题没想透,大概论文出来就好了. 
谢谢帮助,希望大家支援.我会报告进度的.我现在边加UML分析,边做程序. 

11211==========
原文(nbmoon于2001/05/15 00:46粘贴) 
Good morning.我像这样不用每个表建立一个update或者research 
--------------------------------------------------------------------------------

113==========
原文(caozq于2001/05/14 14:37粘贴) 
回复: KINSING我的程序是这样的: 
--------------------------------------------------------------------------------
更新的方法是有的,请看: 
1)返回断开的记录集: 
Public Function Retrieve(ByVal strSql As String) As ADODB.Recordset 
On Error GoTo ErrorHandler 
Dim objConn As ADODB.Connection 
Dim objRs As ADODB.Recordset 

Set objConn = New ADODB.Connection 
Set objRs = New ADODB.Recordset 

Dim strConnString As String 
strConnString = GetConnectString 
objConn.Open strConnString 

Set objRs.ActiveConnection = objConn 
objRs.CursorType = adOpenStatic 
objRs.CursorLocation = adUseClient 
objRs.LockType = adLockBatchOptimistic 
objRs.Source = strSql 
objRs.Open 

Set Retrieve = objRs 

GetObjectContext.SetComplete 

Set objRs.ActiveConnection = Nothing 
Set objRs = Nothing 
Set objConn = Nothing 
Exit Function 
ErrorHandler: 
GetObjectContext.SetAbort 
If Not (objRs Is Nothing) Then 
Set objRs = Nothing 
End If 
If Not (objConn Is Nothing) Then 
Set objConn = Nothing 
End If 

Err.Raise Err.Number, "ERR_dbServReq_Retrieve" & Err.Description, Err.Description 
End Function 
2)对修改后的记录集进行更新 
Public Sub Update(ByRef rsRecord As Variant) 
On Error GoTo ErrHandler 
Dim conn As ADODB.Connection 
Dim rsRecordset As ADODB.Recordset 

Set conn = New ADODB.Connection 
Dim strConnString As String 
strConnString = GetConnectString 
conn.Open strConnString 

Set rsRecordset = rsRecord 
Set rsRecordset.ActiveConnection = conn 
rsRecordset.UpdateBatch 

GetObjectContext.SetComplete 
Exit Sub 
ErrHandler: 
If Not conn Is Nothing Then 
Set conn = Nothing 
End If 

If Not rsRecordset Is Nothing Then 
Set rsRecordset = Nothing 
End If 

GetObjectContext.SetAbort 
Err.Raise Err.Number, "ERR_DBSERVREQ_UPDATE", Err.Description 
End Sub 

不过话说回来,Microsoft的DNA体系确实没有J2EE的好用,使用Entity Bean将省事的多。 

1131==========
原文(nbmoon于2001/05/14 20:07粘贴) 
谢谢caozq,在VC里面也可以这样用吗? 
--------------------------------------------------------------------------------
用client的函数返回断开的recordset,然后在data serve layer的函数接受断开的recordset,同时用设置返回的recordset为adLockBatchOptimistic,然后UpdateBatch更新. 
更新的时候是只更新返回的recordset,还有可以用Editmode属性在data serve layer 测试recordset是更新还是添加吗? 

11311==========
原文(caozq于2001/05/15 10:35粘贴) 
回复: 谢谢caozq,在VC里面也可以这样用吗? 
--------------------------------------------------------------------------------
我没试过,但应该可以。 

113111==========
原文(nbmoon于2001/05/15 13:36粘贴) 
thanks :) 
--------------------------------------------------------------------------------

2==========
原文(dunhill_hw于2001/05/15 01:42粘贴) 
回复: 难题请教,我在3层结构(VC做数据服务层)中,有一组数据库记录要更新,我可以用recordset 
--------------------------------------------------------------------------------
You should create a recordset as BatchUpdate Lock and cursor in client, then open a datasource, when you pass it between tiers, disconnect it from data source by set rs->ActiveConnection to Nothing(VB) or release it(VC), then you can modify it in other tiers. When all modify has done, pass it to origin tier, connect to datasource, then call UpdateBatch. 
Good luck!