ADO在informix的Addnew來源:cww
在RDO時,我曾指出當Resultset.Addnew之後,目前的Resultset不會包含現在新增的這一筆,這是一個比較不好的現象(這在SQL SERVER中不會),試想,如果我們在Table中使用Serial型態的欄位(該Field的值會在每新增一筆資料時自動加一),而我們拿這個欄位的值當作流水來使用,而我們使用.AddNew之後,卻因為Resultset沒有包含該筆資料,所以我們就沒有辦法得知該Serial欄位的值。這時可能得產生一個unique的Key,而後再由資料庫中取得該筆Record。
但在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 ExplicitDim WithEvents cn As ADODB.ConnectionPrivate WithEvents rs As ADODB.RecordsetPrivate qry As ADODB.CommandPrivate adoerr As ADODB.ErrorsPrivate Sub Command2_Click()rs.AddNewrs!case_no = "1105"rs!fld2 = "v"rs.Updaters.Resync adAffectCurrent 如果該Resultset中有Serical欄位, 目的在取得Serical的欄位的值rs.MoveFirstDo While Not rs.EOF Debug.Print rs!case_no, rs!myseri rs.MoveNextLoopEnd SubPrivate Sub Form_Load()Dim connstr As StringDim ans As Integer, errstr As String, sql As StringSet cn = New ADODB.Connectionconnstr = "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 = connstrcn.Opensql = "Select * from testab2 order by case_no"Set rs = New ADODB.RecordsetSet rs.ActiveConnection = cnrs.CursorLocation = adUseClientrs.Source = sqlrs.CacheSize = 30rs.Open , cn, adOpenKeyset, adLockOptimistic, adCmdTextEnd Sub |