分类:
2009-10-11 11:13:32
ADO的连结主要可分成透过OLE DB Privder的方式与OLE DB Provider for ODBC,前者 很明显的是Microsoft公司极力发展的方式,据说它比透过ODBC的方式快且所需资源少 ,但实际上如何,几年之後就可很清楚了。不过目前有Privder提供OLE DB介面者尚没有 非常多,但提供ODBC介面者就很多了,在只有ODBC Driver之下,如果也要使用ADO的话 那可以使用OLE DB Provider for ODBC的介面,然而它的Performance和使用RDO来比, 那得花上好些工夫试看看,至少我没有那些工夫做这种事。 先看看OLE DB Provider for ODBC的连法 Dim connstr As String Set cn = New ADODB.Connection cn.Provider = "MSDASQL" 'Microsoft OLE DB Provider for ODBC) '因为是透过ODBC来做,所以connstr的设定,和使用RDO ODBC的连结字串皆相同 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 testtab order by case_no" Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn '设定该Resultset依附在cn物件上开启 rs.CursorLocation = adUseServer rs.LockType = adLockOptimistic rs.CursorType = adOpenKeyset rs.Source = sql rs.Open 如此启了一个Connection。不过这边要提出的是,ADO不像RDO它的Recordset物件不一定 要附属於某一个已开启的Connection物件。回想一下,一般RDO Recordset的建立是透过 rdoConnection.OpenResultset或rdoQuery.OpenResultset的方式,而rdoQuery的建立是 透过rdoConnection.CreateQuery,所以这里可见到rdoConnection/rdoQuery/rdoResultset 是有阶层观念的,rdoResultset一定要透过现存的一个rdoConnection物件才能建立,但 是在ADO则不同,adoResultset物件可以自行就产生了,不必透过adoConnection物件,但 它也可以将Connection依附在现存的adoConnection之下,像上面的例子便是如此。而以 下的例子则是单独使用ado Resultset建立连结的方式。当然,单独使用Resultset物件来 建立连结它也有建立一个adoConnection来连,只是我们没有办法Reference到它;而在比 较复杂的系统(例如要有Transacction),那还是得先从ado 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" sql = "Select * from testtab order by case_no" Set rs = New ADODB.Recordset '用以下的方式就不用单独设定CursorType/LockType/Source等等的属性,而原本第二 '个叁数是存放所依附的adoConnect物件,现在则改成连结的字串 rs.Open sql, constr, adOpenKeyset, adLockOptimistic 而使用OLE DB 的方式呢? Set cn = New ADODB.Connection connstr = "Data Source=OPEN_VIEW;User=cww;Password=jjh5612;Initial Catalog=Pubs" cn.Provider = "SQLOLEDB" '设定Privder是SQL Server OLE DB,该名称随不同的 'Database Privder不同而有所不同 cn.ConnectionString = connstr cn.Open sql = "Select * from Authors" Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.CursorLocation = adUseServer rs.Open sql, cn, adOpenKeyset, adLockOptimistic 上面的例子中,Data Source指的是SQL Server的名称,而Initial Catalog指的是Database 名称在这里,我们也可以不设定Database的名称,而在ado Connection建立之後再来设 定Connection物件的DefaultDatabase如下: Set cn = New ADODB.Connection connstr = "Data Source=OPEN_VIEW;User=cww;Password=jjh5612;" cn.Provider = "SQLOLEDB" cn.ConnectionString = connstr cn.Open cn.DefaultDatabase = "cwwtest" sql = "Select * from testtab" Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.CursorLocation = adUseServer rs.Open sql, cn, adOpenKeyset, adLockOptimistic Set rs2 = New ADODB.Recordset cn.DefaultDatabase = "Pubs" rs2.Open "Select * from Authors", cn, adOpenForwardOnly, adLockReadOnly 如此一来,同一个Connection物件,便可以有不同Database的asoResultset物件附於其 上了。 而连结Access数据库呢? cn.Provider = "Microsoft.Jet.OLEDB.3.51" connstr = "Data Source=e:\cwwtest.mdb;" cn.ConnectionString = connstr cn.Open sql = "Select * from testtab order by case_no" Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.Open sql, cn, adOpenKeyset, adLockPessimistic 不过使用ADO来连结Access数据库有时候没有办法发挥得像DAO那般的流畅,例如说,在 这个例子中,虽然我们设定悲观锁定(adLockPessimistic),但实际上测试结果,它还是 乐观锁定。再则,它没有办法像DAO使用Seek指令。而且ADO没有CreateDatabase CreateTable的功能;由这里来看,ADO取代DAO的日子尚未到来,但是VB6.0的环境,使 用ADO才有办法把一些良好的数据库环境表现子得很好。