但在ADO中,出乎意料之外的,它维护得不错,在AddNew之後,Current
Record会停在Addnew的那一笔,而不是Addnew前的那一笔,这表示该笔资料已在Resultset之中了!不过如果要使用Serial的栏位,还得在AddNew之後再下一个Resync的Method把值传回来,这个原因在於,我们Informix使用的Cursor是在Client端(我上一篇文章中有说过,OpenLink的Multi-Tier
ODBC Driver for Informix7.2,使用Server端的Cursor会有问题),而Serical栏位的值是Informix
Server给的,所以在Update之後Serial栏位的值必定要由Server中再取出才知道,因此使用Resync方法来做。不过这里仍有一件事要提出,如果有Transaction的情况之下,.AddNew
/
.Update之後,如果Rollback,该笔Data仍会在Client端存在,而且也会占用Serical栏位的一个号码,这也还好啦,只要知道这个情况我们程式设计时注意一下便好了。
Option Explicit
Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors
Private Sub Command2_Click()
rs.AddNew
rs!case_no = "1105"
rs!fld2 = "v"
rs.Update
rs.Resync adAffectCurrent 如果该Resultset中有Serical栏位,
目的在取得Serical的栏位的值
rs.MoveFirst
Do While Not rs.EOF
Debug.Print rs!case_no, rs!myseri
rs.MoveNext
Loop
End Sub
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.Open
sql = "Select * from testab2 order by case_no"
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
rs.Source = sql
rs.CacheSize = 30
rs.Open , cn, adOpenKeyset, adLockOptimistic, adCmdText
End Sub