|
在編寫數據庫應用程序時,常常需要用戶自己在控制面板中配置ODBC數據源。然而對一般用戶而言,配置ODBC數據源的工作是有一定困難的。因此,如果能在程序中動態加載ODBC數據源,就能大大方便應用程序最終用戶的使用。本文介紹在VB中動態加載ODBC數據源的兩種方法。
方法之一:修改注冊表 一般情況下,用戶在控制面板中配置好ODBC數據源后,Windows系統會將用戶配置的信息寫在注冊表中。當應用程序需要用到數據源時,Windows會通知底層接口查閱注冊表中該數據源的配置。例如,如果配置了系統數據源,Windows系統會根據配置修改注冊表中的 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 主鍵。因此,我們只要在應用程序中使用API函數來完成Windows對注冊表所做的工作,就可以達到動態加載數據源的目的。 對于不同類型的數據源,注冊表修改的內容也會各有不同,但基本上都要修改兩個地方:一個是在ODBC.INI子鍵下建立與數據源配置相關的項;另一個是在\ODBC.INI\ODBC Data Source子鍵下建立一個新項,以告訴驅動程序管理器ODBC數據源的類型信息。 下面以配置一個ODBC系統數據源為例,給出一段動態加載Access數據源的VB例程:
Public Function LoadDbSource(StrSourceName, StrSourceDB, StrDescription As String) As Boolean Dim hKey As Long '要打開的注冊表鍵句柄 Dim lReturn As Long '注冊表API函數的執行返回值 Dim StrSubKey As String '要打開的子鍵 Dim Buffer As String * 255 Dim StrSysDir As String Dim StrDbq, StrDriver, StrFil, StrUid As String Dim LngDriverID, LngSafeTransactions As Long Dim StrImplict, StrUserCommit As String Dim LngPageTimeout, LngThreads, LngMaxBufferSize As Long Dim StrDbType As String
'檢測是否安裝 Access ODBC 驅動 odbcjt32.dll lReturn = GetSystemDirectory(Buffer, 255) StrSysDir = Left(Buffer, lReturn) '獲取Windows系統目錄 StrDriver = StrSysDir & "\odbcjt32.dll" If Dir(StrDriver) = "" Then MsgBox "您的計算機中沒有安裝Access的ODBC驅動程序odbcjt32.dll,無法加載數據源。", vbOKOnly + vbCritical LoadDbSource = False Exit Function End If
StrSubKey = "SOFTWARE\ODBC\ODBC.INI" & "\" & StrSourceName lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey) If lReturn <> ERROR_SUCCESS Then LoadDbSource = False Else StrDbq = StrSourceDB LngDriverID = 25 StrFil = "MS Access;" '文件類型"MS Access" for Microsoft Access LngSafeTransactions = 0
Call RegSetValueEx(hKey, "DBQ", 0&, REG_SZ, StrDbq, LenB(StrDbq)) Call RegSetValueEx(hKey, "Description", 0&, REG_SZ, StrDescription, LenB(StrDescription)) Call RegSetValueEx(hKey, "Driver", 0&, REG_SZ, StrSourceDB, LenB(StrSourceDB)) Call RegSetValueEx2(hKey, "DriverID", 0&, REG_DWORD, LngDriverID, 4) Call RegSetValueEx(hKey, "FIL", 0&, REG_SZ, StrFil, LenB(StrFil)) Call RegSetValueEx(hKey, "UID", 0&, REG_SZ, "", LenB("")) Call RegSetValueEx2(hKey, "SafeTransaction", 0&, REG_DWORD, LngSafeTransactions, 4) Call RegCloseKey(hKey)
StrSubKey = StrSubKey & "\Engines\Jet" lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey) If lReturn <> ERROR_SUCCESS Then LoadDbSource = False Else StrImplict = "" StrUserCommit = "Yes" LngPageTimeout = 5 LngThreads = 3 LngMaxBufferSize = 2048
Call RegSetValueEx(hKey, "ImplictCommitSync", 0&, REG_SZ, StrImplict, LenB(StrImplict)) Call RegSetValueEx2(hKey, "MaxBufferSize", 0&, REG_DWORD, LngMaxBufferSize, 4) Call RegSetValueEx2(hKey, "PageTimeout", 0&, REG_DWORD, LngPageTimeout, 4) Call RegSetValueEx2(hKey, "Threads", 0&, REG_DWORD, LngThreads, 4) Call RegSetValueEx(hKey, "UserCommitSync", 0&, REG_SZ, StrUserCommit, LenB(StrUserCommit)) Call RegCloseKey(hKey)
'設置ODBC數據庫引擎名稱 lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", 0&, KEY_WRITE, hKey) If lReturn <> ERROR_SUCCESS Then LoadDbSource = False Else StrDbType = "Microsoft Access Driver (*.mdb)" lReturn = RegSetValueEx(hKey, StrSourceName, 0&, REG_SZ, StrDbType, LenB(StrDbType)) If lReturn = ERROR_SUCCESS Then LoadDbSource = True End If End If End If End Function 在上面的程序中使用了標準的Win32 API注冊表操作函數,在VB "API文本瀏覽器"工具和MSDN中可以很容易查到其詳細說明。
方法之二:使用ODBC DLL提供的函數 Windows系統目錄中提供有一系列專門操作ODBC的動態鏈接庫,其中Odbcinst.dll提供了一個可以動態的增加、刪除和修改數據源的函數SQLConfigDataSource()。微軟在MSDN的幫助文檔中提供了對該函數的詳細使用說明: BOOL SQLConfigDataSource( HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes); 其中:hwndParent為調用窗體句柄;fRequest為操作碼,通過設置不同的值可以實現對數據源的增加、刪除、修改操作,這些對應值可以在MSDN中查到;lpszDriver參數傳遞數據庫引擎,lpszAtrributes是配置信息列表,配置信息條目之間以字符代碼Chr(0)分隔。同樣,我們以上面的Access數據源配置為例寫一個標準函數:
Private Const ODBC_ADD_SYS_DSN = 4 Private Declare Function SQLConfigDataSource Lib "odbccp32.dll" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long
Public Function LoadDbSource2(StrDriver, StrAttributes As String) As Boolean LoadDbSource2 = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, StrDriver, StrAttributes) End Function
在VB程序中調用這個標準例程: Dim StrAttributes As String StrAttributes = "DSN=AccessODBC2" & Chr(0) & "Desciption=動態加載ODBC示例" & Chr(0) StrAttributes = StrAttributes & "Dbq=" & App.Path & "\MyDb.mdb" & Chr(0) & "FIL=MS Access;" & Chr(0) StrAttributes = StrAttributes & "MaxBufferSize=2048" & Chr(0) & "PageTimeout=5" & Chr(0) Call LoadDbSource2("Microsoft Access Driver (*.mdb)", StrAttributes)
上述兩種方法都可以實現VB動態加載ODBC數據源,對于不同類型的數據源,注冊表中記錄的內容會有一些不同。所以,除查閱有關文檔外,程序員可以先通過手工在控制面板中配置數據源,然后再通過觀察注冊表中的內容再進行編程。
|