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 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 |
文章来源于领测软件测试网 https://www.ltesting.net/
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073