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.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.Open sql, cn, adOpenKeyset, adLockOptimistic
Set rs2 = New ADODB.Recordset
cn.DefaultDatabase = "Pubs"
rs2.Open "Select * from Authors", cn, adOpenForwardOnly, adLockReadOnly
如此一來,同一個Connection物件,便可以有不同Database的asoResultset物件附於其上了。