[心得]Excel VBA接Oracle

看板Database作者 (eming)時間13年前 (2012/06/04 08:14), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
以下是我從Excel接上Oracle的過程 花了不少時間走冤枉路 所以想說紀錄下來跟有需要的版友分享 (另外我是社會組畢業的 有些觀念不太清楚 請見諒) 系統資訊 作業系統:win7 pro 64 bits 資料庫:Oracle 10g 1.Driver選用 64-bit Oracle Data Access Components (ODAC) http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html 下載解壓後 找到setup.exe 選run as administrator安裝 2.sqlnet.ora & tnsnames.ora設定 到Driver的資料夾的Network->Admin (我的路徑如下C:->app->User->product->11.2.0->client_1->Network->Admin) 這邊我不懂為什麼Driver沒有帶我走一遍 印象中安裝32bit的Driver就有的樣子 以下是我的設定 tnsnames.ora $DB_NAME = (DESCRIPTION = (ADDRESSLIST = (ADDRESS = PROTOCOL = TCP)(HOST = $HOSTNAME)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = $DB_NAME) ) ) sqlnet.ora SQLNET.AUTHENTICATION_SEFVICES=NTS) NAMES.DIRECTORY_PATH=(TNSNAMES) 3.ODBC設定 到我的電腦->控制台->system and security->Administrative Tools ->Data Sources(ODBC) 點開選User DSN ->Add 選Driver "Oracle in OraClient11g_home1" Data Source Name:(自己取) Desription:(自己取) TNS Service Name:$DB_Name User ID:$DB_Username 輸入後按"Test Connection"測試一下 4.Excel VBA 我覺得重要的是connect string 應該是ADO吧 DataSource要填之前在ODBC填的Data Source Name strConOracle = "Provider=MSDASQL.1;Persist Security Info=False;" & _ "Password=XXXXXX;User ID=$DB_Username;Data Source=$DB_NAME" 還有在Command加上CommandTimeOut的property 避免復雜Query時間過長造成ORA-01013 Error 我這邊只用300秒 Sub OracelQuery() Dim strConOracle As String Dim oConOracle, oRsOracle, OracleCommand As Object Dim strSQL As String Dim lngCount As Long Dim strCount As String Dim x As String Dim total_field_count, i As Integer x = Workbooks("oracle").Worksheets("QUERY").Range("A1").Value strConOracle = "Provider=MSDASQL.1;Persist Security Info=False;" & _ "Password=XXXXXX;User ID=$DB_Username;Data Source=$DB_Name" Set oConOracle = CreateObject("ADODB.Connection") Set oRsOracle = CreateObject("ADODB.RecordSet") Set OracleCommand = CreateObject("ADODB.Command") oConOracle.Open strConOracle strSQL = x With OracleCommand .ActiveConnection = oConOracle .CommandType = 1 .CommandText = strSQL .CommandTimeout = 300 End With Set oRsOracle = OracleCommand.Execute total_field_count = oRsOracle.Fields.Count Sheets("Unconfirmed Details").Select Range("A2").Select ActiveCell.CopyFromRecordset oRsOracle For i = 1 To total_field_count Workbooks("oracle").Worksheets("Unconfirmed Details").Cells(1, i).Value = oRsOracle.Fields(i - 1).Name Next oConOracle.Close Set oRsOracle = Nothing Set oConOracle = Nothing End Sub -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 24.6.30.127 ※ 編輯: Eming 來自: 24.6.30.127 (06/04 08:18) ※ 編輯: Eming 來自: 24.6.30.127 (06/04 08:18)
文章代碼(AID): #1Fo_tubH (Database)