excel|訪問|資料 Excel 2000作為一個試算表軟體,它不僅有強大的資料處理能力,而且它的報表功能也是十分強大。因而常常用Excel 2000去調用Access、SQL Server、Oracle、DB2等資料庫軟體建立的大型資料庫的內容。使用者可以在工作表中對這些資料進行篩選、排序、查詢、編輯和列印報表,十分方便,這也是大多數人都熟悉的。但如何去調用這資料呢?本人在這裡提供4種方法。
下面四種方法必須要先建立一個資料來源,我們以SQL Server7.0內的樣本資料庫pubs為例。在控制台/ODBC資料來源/系統DSN,單擊增加按紐,選取SQL Server驅動程式,建立一個與pubs資料庫連接的叫pubs名稱資料來源。
方法一:
在Excel 2000中,選擇 資料/擷取外部資料/建立資料庫查詢,然後按嚮導的提示一步一步做,最後將資料返回Excel 2000中就行了
這種方法是大家常用的,也是最方便的。但這種方法只能對遠端資料進行查詢,不能對遠端資料進行增加和修改。
方法二:
這種方法需要VBA編程(方法三、方法四也一樣),在Visual Basic編程中,我們經常用ADO來訪問資料。ADO是Microsoft提供的針對各種各樣資料來源的新型進階編程介面。它支援大多資料庫操作,在Excel 2000中應用ADO來訪問資料,是十分理想的方法。看看下面一個執行個體:
Sub opendb()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=pubs"
rs.Open "select * from authors", cn
Range("a1").CopyFromRecordset rs
Rs.close
cn.Close
End Sub
宏中第一、二句定義了一個ADO 的Connection對象和一個Recordset對象,第三、四句建立了一個ADO 的Connection對象和一個Recordset對象。第五句串連到前面我們建立的資料來源pubs資料庫。第六句是ADO 的Recordset對象執行一條SQL裡select語句。在這也可以執行insert,update等等SQL語句的。第七句是將rs裡的記錄返回當前表裡。第八、九句是關閉串連。運行前要在Excel 2000工具/引用中引用ADO的庫檔案。
在Excel 2000中應用ADO對象,不僅可以對資料庫進行查詢,而且可以作增加,修改資料庫的記錄,甚至可以調用SQL SERVER7.0的預存程序,加強Excel 2000對資料庫處理能力。
方法三:
Excel 2000的功能是十分強大的,它內建了一個ODBC載入宏,我們在Excel 2000中引用這個宏檔案xlodbc.xla,就可以通過下面的方法去訪問我們建立的資料來源了
Sub opendb()
Dim id as integer
id = SQLOpen(“DSN=pubs”)
SQLExecQuery id, “select * from authors”
Set output = Worksheets("Sheet1").Range("A1")
SQLRetrieve id, output, , ,
True SQLClose id
End sub
第二句是調用xlodbc.xla宏中的SQLOpen函數建立一個對資料庫pubs串連,第三句是SQLExecQuery函數執行了一條select語句,id是由 SQLOpen 函數返回的唯一串連標識,第四句是SQLRetrieve函數將SQLExecQuery函數執行的查詢的結果返回到Excel 2000中。
這種編程方法可以說來的容易,用得方便。也是一種好的訪問遠端資料方法。
方法四:
這種方法是使用API方法,下面是一個執行個體
'分配環境控制代碼
res = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, hEnv)
'設定環境屬性
res = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
'分配資料庫連接控制代碼
res = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hSvr)
'串連到資料來源
sConnect=“DSN=pubs;DATABASE=pubs“
res=SQLDriverConnect(hSvr,ByVal,0&,sConnect,Len(sConnect),sConnOut, Len(sConnOut), _ nConnOutLen, 0)
sSql =“select * from authors“
res = SQLExecDirect(hSel, sSql, Len(sSql))
'將記錄返回當前表裡
res=SQLNumResultCols(hSel, Nc)
Do While (SQLFetch(hSel) <> SQL_NO_DATA_FOUND)
J=j+1
FOR I=1 TO Nc
res = SQLGetData(hSel, I, SQL_C_CHAR, tmp, 512, pl)
Cells(j, i) =tmp
Next I
Loop
'釋放資料庫連接控制代碼
res = SQLAllocHandle(SQL_HANDLE_STMT, hSvr, hSel)
'釋放資料庫連接控制代碼
ret = SQLFreeHandle(SQL_HANDLE_ENV, hEnv)
這種方法比較複雜,調試也比較困難,但運行速度快,在進行大量查詢資料和自己在API調用方面比較熟時,可以用這個方法。在用上面的執行個體時,要做API聲明和常量的定義。