程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 微軟Excel用ODBC輕松獲得DB2數據

微軟Excel用ODBC輕松獲得DB2數據

編輯:DB2教程
    ·動態配置ODBC數據源
    ·如何給ODBC連接打開連接池
    ·配置ODBC數據源
    ·如何動態設置ODBC源的技巧
    ·ODBC 連接數據源
    ·在VC中動態加載 ODBC的方法
    ·PB應用ODBC訪問不同數據庫
    ·ASP、CGI、ISAPI、ODBC之間的差別
    ·ODBC慨述
    ·ODBC 基礎

Microsoft Excel是用戶經常使用的制表工具,它可以用ODBC很方便地得到AS/400上的DB2數據。具體操作如下(操作步驟用WIN2000+Office2000環境描述,用戶已配置好ODBC數據源):

1.打開Microsoft Excel,建立一個新表。

2.打開“數據”->“獲取外部數據”->“新建數據庫查詢”菜單,如圖1所示。

微軟Excel用ODBC輕松獲得DB2數據(圖一) 圖1

3.選中以創建好的ODBC數據源(如as400db2),按“確定”按鈕,輸入用戶名、口令後,彈出“查詢向導”畫面,如圖2所示。

微軟Excel用ODBC輕松獲得DB2數據(圖二) 圖2

4.在圖2中選中你要查詢的物理文件並將需要的字段選到“查詢結果中的列”中,如圖3所示。

微軟Excel用ODBC輕松獲得DB2數據(圖三) 圖3

5.點擊“下一步”,對數據進行篩選。(此例中,沒有篩選操作),如圖4所示。

微軟Excel用ODBC輕松獲得DB2數據(圖四) 圖4

6.點擊“下一步”,確定關鍵字。(此例中,沒有選關鍵字),如圖5所示。

微軟Excel用ODBC輕松獲得DB2數據(圖五) 圖5

7.點擊“下一步”,進入圖6所示的畫面,選“將數據返回Microsoft Excel(R)”。

微軟Excel用ODBC輕松獲得DB2數據(圖六) 圖6

8.點擊“完成”,將數據采集到Microsoft Excel中,如圖7所示。

微軟Excel用ODBC輕松獲得DB2數據(圖七) 圖7 ∩銜奈頤翹致哿巳绾臥贠DBC數據源裡配置數據庫,通過這種方式,應用程序的編寫變的簡單。只需要在應用程序裡面指定已經配置好的數據源就可以連接,訪問數據庫。但是,這種方式也有一定的局限性,需要手工的在ODBC數據源裡面配置。需要教會程序的使用者如何去配置,而且,如果一不小心更改了ODBC數據源的配置(也許是無意的)。就會造成連接數據庫失敗。這時候,程序的使用人員也許會一籌莫展,束手無策。

  自然的,讀者就會提出這樣一個問題,能不能不通過ODBC數據源的配置,而在程序裡面,根據程序安裝的環境,自動的配置數據庫連接。答案是肯定的,下面我們就介紹一種在程序中通過修改Window注冊表的辦法來動態的配置ODBC數據源的方法。

  其實現的基本思想是這樣的:先把開發環境下的注冊表中的ODBC數據源信息導出到一個文件中,然後將導出的內容作為應用程序中的字符串常量進行保存。在程序運行的時候,檢查ODBC數據源的注冊情況,如果發現注冊不正確,就根據環境的信息和字符串常量動態的確定注冊表的內容,寫如一個臨時的注冊表文件中。用批處理文件將該臨時文件中的ODBC數據源信息導入到系統注冊表,從而實現了ODBC數據源的動態注冊。

  操作步驟
  1.運行注冊表編輯器程序(Regedit.exe)。

  2.從注冊表項\HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources下導出數據源名稱信息到Reg1.reg文件中。這個表項下面存放的是用戶定義的數據源,如果需要系統數據源信息,則可導出HKEY_Local_Machine\Software\ODBC.INI\ODBC Data Sources到注冊文件中。

  3.導出要注冊的數據源名稱的具體連接參數信息到db2.reg中。在此,以導出名稱為“PostMdb”的數據為例,具體路徑: \HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb。

  4.用文本編輯器如(NotePad.exe)打開上述db1.reg文件,保留數據源名稱為PostMdb的行;並將db2.reg文件內容與當前db1.reg內容合並。假設修改後“PostMdb”數據源注冊信息如下:

  REGEDIT4

  [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources]

  ″PostMdb″=″Microsoft Access Driver (*.mdb)″

  [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb]

  ″Driver″=″C:\\Windows\\SYSTEM\\ODBCJT32.DLL″

  ″DBQ″=″c:\\My Documents\\db1.mdb? r>
  ″Description″=″Post Card Mis Database″

  ″DriverId″=dWord:00000019

  ″FIL″=″MS Access;″

  ″SafeTransactions″=dWord:00000000

  ″UID″=″″

  [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb\Engines]

  [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb\Engines\Jet]

  ″ImplicitCommitSync″=″″

  ″MaxBufferSize″=dWord:00000800

  ″PageTimeout″=dWord:00000005

  ″Threads″=dWord:00000003

  ″UserCommitSync″=″Yes″5.動態注冊ODBC數據源的實現從上述注冊信息可以看出,對於特定的數據源來說,實際上要動態確定的只是“Driver”和“DBQ”兩項內容。將“Driver”=“C:\\Windows\\SYSTEM\\ODBCJT32.DLL”修改為“Driver”=“%s\\ODBCJT32.DLL”,將“DBQ”=“c:\\My Documents\\db1.mdb”修改為“DBQ”=“%s\\db1.mdb”。復制修改後的注冊信息到程序單元中存儲為一字符串常量,命名為OdbcStr。以下以Delphi為例說明實現方法。

  如果要將 ODBC 驅動程序加入到連接共享中,
則必須配置數據庫驅動程序並在 Windows NT 注冊表中
設置驅動程序的 CPTimeout屬性。當 ODBC 斷開連接時,
連接被存入池中,而不是被斷開。
  CPTimeout 屬性決定在連接池中的連接保留的時間長度。
如果在池中連接保留的時間比 CPTimeout 設置的時間長,則
連接將被關閉並且從池中刪除。CPTimeout 的默認值是 60 秒。
  當然羅,可以通過創建如下設置的注冊表鍵來設置 CPTimeout
的屬性,從而啟用特定 ODBC 數據庫驅動程序的連接池:
\HKEY_LOCAL_MacHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout
例如設置為100(單位為秒)
注意 默認情況下,通過將 CPTimeout 設置為 60 秒,
Web 服務器將激活 SQL Server(Windows平台上強大的數據庫平台) 的連接池。 DBC管理器(Administrator)它負責安裝驅動程序,管理數據源,並幫助程序員跟蹤ODBC的函數調用。在ODBC中,應用程序不能直接存取數據庫,它必須通過管理器和數據庫交換信息。ODBC管理器負責將應用程序的SQL語句及其他信息傳遞給驅動程序,而驅動程序則負責將運行結果送回應用程序。運行32bit ODBC管理器後,出現一個主對話框,它的主要內容是要求用戶輸入一個數據源,所謂數據源就是數據庫位置、數據庫類型以及ODBC驅動程序等信息的集成。數據源負責將運行結果送回應用程序。應用程序、ODBC管理在使用之前必須通過ODBC管理器進行登記和連接,啟動ODBC管理器後,選取Add按鈕,根據自己的數據庫類型,選擇相應的ODBC驅動程序,然後輸入數據源名(Data Source Name)和數據庫文件名(Database Name),完成這些步驟後,以後的應用程序就能夠通過ODBC管理器的數據源直接操縱數據庫。
  在Window95或者98下,ODBC管理器在控制面板裡面的32bit ODBC。而在WINDOW2000下,ODBC管理器是在程序à管理工具à數據源(ODBC)中。第一次找它費了我好大的力氣。後來動用了搜索才找到的。(想想自己還真夠笨的。L)

下面以Window2000下的ODBC管理器為例,介紹一下每一頁的用途:
  1、 用戶DSN:ODBC用戶數據源存貯了如何與指定數據庫提供者連接的信息。只對當前用戶可見,而且只能用於當前機器上。這裡的當前機器是只這個配置只對當前的機器有效,而不是說只能配置本機上的數據庫。它可以配置局域網中另一台機器上的數據庫的。
  2、 系統DSN: ODBC系統數據源存貯了如何指定數據庫提供者連接的信息。系統數據源對當前機器上的所有用戶都是可見的,包括NT服務。也就是說在這裡配置的數據源,只要是這台機器的用戶都可以訪問。
  3、 文件DSN:ODBC文件數據源允許用戶連接數據提供者。文件DSN可以由安裝了相同驅動程序的用戶共享。這是界於用戶DSN和系統DSN之間的一種共享情況。
  4、 驅動程序:這頁列出了本機上所有安裝的數據庫驅動程序。裡面列舉了每個驅動程序的名稱,版本,提供商公司,驅動程序文件名,以及安裝日期。
  5、 跟蹤:ODBC跟蹤允許創建調用ODBC的日志,提供給技術人員查看。裡面可設定日志的路徑和文件名。技術人員通過這裡面的信息可以看到本機上所有的數據庫訪問的時間,用戶,以及出錯信息等情況。也可以通過這個輔助調試應用程序,可以啟動Visual Studio的分析器,來進行ODBC的跟蹤。
? 6、 連接池:連接池允許應用程序重用原來打開的的連接句柄,這樣可以節省到服務器的往返過程。
  7、 關於:最後這一頁列出了所有的ODBC的核心文件。 很多時候程序員需要自動生成ODBC數據源,而不是指導客戶"打開控制面板… … ",到底如何去做呢?相信很多人會選擇編程修改注冊表來實現這項功能,因為ODBC的詳細信息全部存放在注冊表的下述鍵值內:

"HKEY_LOCAL_MacHINE\SOFTWARE\ODBC"

修改一下ODBC的配置,通過前後的注冊表比較,你可以發現一定的規律。在這裡我只是想說,哥們,別這麼犯傻了(如果我讓你寫一個通用的ODBC源處理程序,你得累死),用這個Windows ODBC API函數吧,

function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;
lpszDriverString: String; lpszAttributes: String): Integer;
stdcall;external 'ODBCCP32.DLL';

  了解數據庫編程的朋友都知道,數據庫的訪問方式不論DAO、ADO、ODBC或是BDE或是其它第三方的數據庫連接控件,歸根結底,都是一些個函數集,只要你願意,你可以編寫出自己的數據庫訪問方式用以替代。深入研究這些底層函數,很多時候會為你提供相當地便利。
  SQLConfigDataSource這個函數MSDN有詳細的說明,我不想整段翻譯下來讓你扁我,我只是結合流行的SQL Server(Windows平台上強大的數據庫平台)談談如何有技巧的調用該函數。其它的數據庫大同小異。

  SQLConfigDataSource(0, ODBC_ADD_SYS_DSN,'SQL Server(Windows平台上強大的數據庫平台)',
  'DSN=Record_ODBC'+ chr(0) +
  'Server=(local)'+ chr(0) +
  'Database=master'+ chr(0) +
  'Description=DragonPC SQLServer ODBC Source'+ chr(0));

  這是我的Delphi程序中調用該函數的一個實例,第一個參數是父窗口句柄,設置為0則該函數不顯示任何對話框。第二個參數是操作類型,你需要定義如下的操作類型常量: Const
  ODBC_ADD_DSN = 1; // Add a new user data source.
  ODBC_CONFIG_DSN = 2; // Configure (modify) an existing user data source.
  ODBC_REMOVE_DSN = 3; // Remove an existing user data source.
  ODBC_ADD_SYS_DSN = 4; // Add a new system data source.
  ODBC_CONFIG_SYS_DSN = 5; // Modify an existing system data source.
  ODBC_REMOVE_SYS_DSN = 6; // Remove an existing system data source.

  從名字我們知道,要添加ODBC源,我們需要調用的是ODBC_ADD_SYS_DSN 或是ODBC_ADD_DSN參數。第三個參數也沒有什麼好說的,我們添加的是sql server(Windows平台上強大的數據庫平台)數據庫的ODBC源,所以填入'SQL Server(Windows平台上強大的數據庫平台)'參數,如果需要建立Excel文件的ODBC數據源,我們可以填入'Excel Files (*.xls)',這些字符串參數相信各位同志在添加ODBC源時,已經多次見過。
關鍵的是第三個參數的設置,不同的數據庫類型所支持的關鍵字是不一樣的,這裡僅僅就SQL Server(Windows平台上強大的數據庫平台)所支持的關鍵字作一個簡單說明:
  DSN:你的ODBC數據源名稱。
  Server:你的數據庫服務器名稱,使用(local)指的是本地計算機安裝的數據庫。注:最新的sql server(Windows平台上強大的數據庫平台) 2000支持一台計算機運行多個SQL Server(Windows平台上強大的數據庫平台)服務,這個時候你需要指定SqlSever的InstanceName。
  Address:指定SQL Server(Windows平台上強大的數據庫平台)服務器的網絡IP地址。
  Database:指定默認數據庫名稱。
  Language:指定默認語言。
  Description:備注信息。

  詳細的參數和信息可以查閱微軟網站的以下網址。
  http://msdn.microsoft.com/library/psdk/dasdk/odch3kit.htm
  http://msdn.microsoft.com/library/psdk/sql/od_odbc_c_99yd.htm

本教程中,我們將學習使用ODBC APIs的細節.

因為我們的程序並不與ODBC驅動程序直接通信,而是通過ODBC管理器來定義一系列APIs供你的程序調用以完成工作,所以我們需要包含odbc32.inc和odbc32.lib文件,當然還有Windows.inc。

連接數據源需要以下幾步:

  1. 分配一個環境句柄(environment handle). 在進行每個ODBC任務(session)時僅需這樣做一次.一旦獲得了句柄,我們就可修改環境屬性來適合我們的需要。你可以把這想象為在DB工作中創建一個workspace.
  2. 確認將使用的ODBC的版本. 你可在ODBC 2.x版和3.x版間選擇.他們在很多方面存在不同,因此本步驟是必須的以使得ODBC管理器它將用何種語法與用戶程序通訊,及如何解釋用戶程序的命令.
  3. 分配一個連接句柄.這個步驟可看作創建一個空連接.我們還沒有指定使用那一個驅動程序,連接那一個數據庫.這些信息將在稍後來寫入.
  4. 建立一個連接.可通過調用ODBC函數來建立連接.

當連接完成時,必須通過以下步驟來關閉和銷毀它:

  1. 斷開與數據源的連接.
  2. 釋放連接句柄.
  3. 釋放環境句柄 (如果不再需要在這個環境中作更多連接)

分配一個句柄

在ODBC 3.x版本以前,我們需要調用很多獨立的函數來分配環境、連接和語句句柄(SQLAllocEnv, SQLAllocConnect, SQLAllocStmt).而在ODBC 3.x中, 這些函數被SQLAllocHandle所代替,語法如下:

SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE * OutputHandlePtr);

看上去挺麻煩,簡化一下看看:

SQLAllocHandle proto HandleType:DWord,
InputHandle:DWord,
OutputHandlePtr:DWord

SQLRETURN 被定義為SQLSMALLINT類型.而 SQLSMALLINT被定義為短整型,例如一個字(16 bits). 所以該函數的返回值在ax中,而不是 eax. 這是很重要的.但是Win32下函數的參數是通過32位堆棧來傳送的.即使這個參數只是一個字長(16位),它也應被擴展為32位.這就是為什麼HandleType被說明為雙字(dword)而不是字(word).看一下導入庫 odbc32.lib,SQLAllocHandle的入口是_SQLAllocHandle@12. 就是說這個函數的參數的組合長度為12字節(3 dWords).然而,這不是說C函數的原型不對. SQLAllocHandle會只用HandleType的底位字並忽略高位字.因此C函數原型是功能上(functionally)正確而我們的匯編函數原型反映了實際.

結束了SQL類型的討論,我們來看一看函數的參數和返回值。.

  • HandleType 是一個常數,定義了希望分配的句柄類型.可能值如下:
SQL_HANDLE_ENV 環境句柄(Environment handle) SQL_HANDLE_DBC 連接句柄(Connection handle) SQL_HANDLE_STMT 語句句柄(Statement handle) SQL_HANDLE_DESC 描述符句柄(Descriptor handle)

描述符是一個數據集合描述了一個SQL語句的參數或一個結果集的列數, 視應用程序或驅動程序而定。

  • InputHandle 是指向父"文本"的句柄.就是說,如果你想分配一個連接句柄, 需要通過一個環境句柄因為連接將在那個環境的文本中建立.如果你想分配一個環境句柄,這個參數必須為SQL_HANDLE_NULL (注意SQL_HANDLE_NULL在windows.inc版本1.18及其以前版本中被不正確的定義為0L.你需要刪除掉"L"否則程序不會被編譯通過.這是我的錯,因為我負責修訂Windows.inc中的 SQL/ODBC部分.) 因為環境沒有父文本.對於語句和描述符句柄,我們需要將連接句柄作為這個參數。
  • OutputHandlePtr 如果調用成功,將指向一個雙字,其中包含了被分配的句柄.

SQLAllocHandle 可能的返回值如下:

SQL_SUCCESS 函數成功完成. SQL_SUCCESS_WITH_INFO 函數成功完成,但帶回非致命錯誤或警告. SQL_ERROR 函數調用失敗. SQL_INVALID_HANDLE 傳送給函數的句柄非法.

無論函數的調用成功還是失敗,我們都可通過調用SQLGetDiagRec或SQLGetDiagFIEld函數來獲得更多的信息.它們與Win32 API中的GetLastError很相似.


例子:

.data?
hEnv dd ?

.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

選擇ODBC的版本

分配完環境句柄後,我們需要設置一個環境屬性SQL_ATTR_ODBC_VERSION以適當的值.設置環境屬性可通過調用函數SQLSetEnvAttr.你也許猜到了,還有類似的函數如 SQLSetConnectAttr和SQLSetStmtAttr. SQLSetEnvAttr原型如下:

SQLSetEnvAttr proto EnvironmentHandle:DWord,
Attribute:DWord,
ValuePtr:DWORD, StringLength:DWord
  • EnvironmentHandle. 與字面意思一樣, 它包含了要設置屬性的環境句柄.
  • Attribute. 這是一個常數,表示用戶需要設置的屬性.對我們而言,是SQL_ATTR_ODBC_VERSION.可以從MSDN中查看全部列表.
  • ValuePtr. 這個參數的意義由希望設置的屬性值決定.如果屬性值是32位的, 這個參數將被認為是想要設置的屬性值.如果屬性值是一個字符串或二進制緩沖區,它就被解釋為指向字符串或緩沖區的指針.如果我們指定了要設置的屬性為SQL_ATTR_ODBC_VERSION, 這個參數我們可以填入SQL_OV_ODBC3和SQL_OV_ODBC2這兩個可能值,分別對應ODBC 3.x和2.x.
  • StringLength. 由ValuePtr指向的值的長度. 如果這個值是字符串或二進制緩沖區,這個參數一定是合法的. 如果想設置的屬性是一個雙字,這個參數被忽略.因為 SQL_ATTR_ODBC_VERSION屬性包含一個雙字的值,我們可以只給它賦為NULL.

這個函數的返回值與SQLAllocHandle相同.

例子:

.data?
hEnv dd ?

.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLSetEnvAttr, hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, NULL
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

分配連接句柄

這一步與分配環境句柄相似,我們可以通過調用SQLAllocHandle函數並賦以不同的參數值來完成.

例子:

.data?
hEnv dd ?
hConn dd ?

.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLSetEnvAttr, hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, NULL
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

建立一個連接

我們現在要通過特定的ODBC驅動程序來連接數據源.通過這三個ODBC函數來達成這個目標.它們為我們提供了好幾層"選擇".

SQLConnect Core 這是最簡單的函數。它只需要數據源名(DSN,Data source name)和可選的用戶名和密碼.它不提供任何GUI選項例如向用戶顯示一個對話框來提供更多信息。如果你已經有了需要使用的數據庫的DSN就可以使用這個函數. SQLDriverConnect Core 這個函數提供了較SQLConnect更多的選擇.我們可以連接一個沒有在系統信息內定義的數據源。如沒有DSN.另外,我們可以指定這個函數是否需要顯示一個對話框來為用戶提供更多信息.例如,如果用戶遺漏了數據庫的名字,它會指導ODBC驅動程序顯示一個對話框,讓用戶來選擇想連接的數據庫. SQLBrowseConnect Level 1 這個函數允許在運行時(RunTime)枚舉數據源.比SQLDriverConnect更加靈活。因為可以多次順序調用SQLBrowseConnect,而每次提供給使用者更多的專用信息直到最後獲得需要的連接句柄.

我將先檢查SQLConnect函數.要使用 SQLConnect,你應先知道什麼是DSN. DSN是數據源名(Data Source Name)的縮寫,是一個唯一標識某數據源的字符串。一個DSN標識了一個包含了如何連接某一特定的數據源的信息的數據結構.這個信息包括要使用何種ODBC驅動程序及要連接哪個數據庫.我們可以通過控制面板中的32位ODBC數據源來創建、修改及刪除DSN.

SQLConnect的語法如下:

SQLConnect proto ConnectionHandle:DWord
pDSN:DWord,
DSNLength:DWord,
pUserName:DWord,
NameLength:DWord,
pPassword:DWord,
PasswordLength:DWord
  • ConnectionHandle. 要使用的連接句柄.
  • pDSN. 指向DSN的指針.
  • DSNLength. DSN的長度
  • pUserName. 指向用戶名的指針
  • NameLength. 用戶名的長度
  • pPassWord. 指向該用戶名所使用密碼的指針
  • PassWordLength. 密碼的長度

在最小情況下, SQLConnect 需要連接句柄,DSN和DSN的長度。如果數據源不需要的話,用戶名和密碼就不是必須的.函數的返回值與SQLAllocHandle的返回值相同.

假設我們的系統中有一個叫做"Sales" 的DSN並且我們想連接這個數據源.我們可以這樣做:

.data
DSN db "Sales",0

.code
......
invoke SQLConnect, hConn, addr DSN, sizeof DSN,0,0,0,0

SQLConnect 的缺點是:在連接一個數據源之前,我們必須創建它的DSN. SQLDriverConnect 提供了更大的靈活性.它的語法如下:

SQLDriverConnect proto ConnectionHandle:DWord,
hWnd:DWord,
pInConnectString:DWord,
InStringLength:DWord,
pOutConnectString:DWord,
OutBufferSize:DWord,
pOutConnectStringLength:DWORD, DriverCompletion:DWord
  • ConnectionHandle連接句柄
  • hWnd 應用程序窗口句柄.如果這個參數被置為NULL,驅動程序將不會為用戶顯示一個對話框來顯示更多信息(如果有的話).
  • pInConnectString 指向連接字符串的指針. 這是一個ASCIIZ字符串,格式由要連接的具體ODBC驅動程序描述.它描述了驅動程序名、數據源及其他附加屬性.連接字符串的具體描述請參見MSDN,這裡不再細述.
  • InStringLength 連接字符串的長度.
  • pOutConnectString 指向將要被填入完整連接字符串的緩沖區的指針.這個緩沖區將至少有1,024字節長.這聽上去使人困惑。事實上,我們提供的連接字符串會不完整,這時,ODBC驅動程序會提示用戶更多信息.接下來ODBC驅動程序會根據所有可能的信息創建一個完整的連接字符串並將其放入緩沖區。即使我們提供的連接字符串已經可以工作了,這個緩沖區也會填入更多的屬性值.這個參數的目的是我們可以保存完整連接字符串來為接下來的連接做准備。
  • OutBufferSize 由pOutConnectString指向的緩沖區的長度.
  • pOutConnectStringLength 指向一個雙字的指針,用來接收由ODBC驅動程序返回的完整連接字符串的長度。
  • DriverCompletion 一個標志用來指示ODBC管理器/驅動程序是否將提示用戶更多信息.但是,這個標志取決於是否在調用本函數時傳送了hWnd 參數一個窗口句柄。如果沒有,即使該標志被設置,ODBC管理器/驅動程序也不會提示用戶.可能值如下:

    SQL_DRIVER_PROMPT ODBC驅動程序提示用戶輸入信息。驅動程序將利用這些信息來創建連接字符串. SQL_DRIVER_COMPLETE
    SQL_DRIVER_COMPLETE_REQUIRED 僅當用戶提供的連接字符串不完全時, ODBC驅動程序才會提示用戶. SQL_DRIVER_NOPROMPT ODBC驅動程序將不會提示用戶.

例子:

.data
strConnect db "DBQ=c:\data\test.mdb;DRIVER={Microsoft Access Driver (*.mdb)};",0

.data?
buffer db 1024 dup(?)
OutStringLength dd ?

.code
.....
invoke SQLDriverConnect, hConn, hWnd,
addr strConnect, sizeof strConnect, addr buffer, sizeof buffer,
addr OutBufferLength, SQL_DRIVER_COMPLETE

斷開與數據源的連接

在連接順利完成後,我們就可以對數據源進行查詢及其他操作.這些將在下一節討論.現在假設我們已完成了對數據源的操作,就可以通過調用SQLDisconnect來斷開與它的連接. 這個函數非常簡單(就象那悲傷而冷酷的現實:毀滅總比創造容易的多).它只需要一個參數:連接句柄。

invoke SQLDisconnect, hConn

釋放連接與環境句柄

在順利地斷開連接後,我們現在可以調用SQLFreeHandle函數來銷毀連接句柄和環境句柄. 這是由ODBC 3.x提供的新函數.它替代了SQLFreeConnect, SQLFreeEnv及SQLFreeStmt函數. SQLFreeHandle語法如下:

SQLFreeHandle proto HandleType:DWORD, Handle:DWord
  • HandleType 標識要銷毀句柄的類別的常數.可能值與 SQLAllocHandle中相同
  • Handle要銷毀的句柄.

For example:

invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv

在使用 VC、 VB、 Delphi等高級語言編寫數據庫應用程序時,往往需要用戶自己在控制面板中配置 ODBC數據源。對於一般用戶而言,配置 ODBC數據源可能是一件比較困難的工作。而且,在實際應用中,用戶往往要求在同一個應用程序中訪問不同的數據源,因此采用一般的加載方法就有了無法克服的缺陷。為能在程序中完成這一工作,方便應用程序的使用,本文以 VC為開發環境介紹兩種在應用程序中動態加載 ODBC系統數據源的方法。

  方法一:修改注冊表

  設計思路

  一般情況下,當用戶在控制面板中配置好 ODBC數據源後, Windows系統便在注冊表中加入了一些子鍵來存儲用戶的配置結果。當應用程序需要用到數據源時, Windows便會通知底層接口查閱注冊表中該數據源的配置。如果用戶刪除了某個 ODBC數據源,那麼也會在注冊表中有所反應。如果配置的數據源是用戶數據源, Windows系統便會修改注冊表的 HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI子鍵;如果配置的數據源是系統數據源, Windows系統便會修改注冊表的 HKEY_LOCAL_MacHINE\SOFTWARE\ODBC\ODBC.

  INI主鍵。因此,我們可以在應用程序中使用 Windows API中的注冊表編輯函數來完成 Windows所做的工作,這樣就可以達到動態加載數據源的目的。具體實現對於不同類型的數據源,注冊表的修改也各有不同,但基本上都要修改兩個地方。一個是在 ODBC.INI子鍵下建立一個與數據源描述名同名的子鍵,並在該子鍵下建立與數據源配置相關的項;另一個是在 \ODBC.INI\ODBC Data Sources子鍵下建立一個新項以便告訴驅動程序管理器 ODBC數據源的類型。下面以配置一個 Microsoft Access數據源為例給出實現此功能的函數的代碼。

/* strSourceName是要創建的數據源名, strSourceDb是數據庫存放路徑, strDescription是數據源的描述字符串。* /

BOOL CLoadOdbcDlg:: LoadDbSource(CString strSourceName,CString strSourceDb, CString strDescription)

{

//存放打開的注冊表鍵

HKEY hKey;

DWord dw;

//存放注冊表 API函數執行的返回值

LONG lReturn;

//存放要打開的子鍵

CString strSubKey;

//檢測是否安裝了 MS Access ODBC driver:odbcjt32.dll

//獲得 Windows系統目錄

char sysDir[MAX_PATH];

char drvName[]=" \\odbcjt32.dll" ;

::GetSystemDirectory (sysDir,MAX_PATH);

strcat(sysDir,drvName);

CFileFind findFile;

if(!findFile.FindFile (sysDir))

{

AfxMessageBox("您的計算機系統中沒有安裝 MS Access的 ODBC驅動程序 odbcjt32.dll,您將無法加載該類數據源。 " ,MB_OK|MB_ICONSTOP);

return false;

}

strSubKey=" SOFTWARE\\ODBC\\ODBC.INI\\"+ strSourceName;

對於管理信息系統和數據庫應用系統的開發,人們往往根據實際需求采用不同的數據庫系統。應用這些系統,各單位各部門投入了大量的人力、物力,相繼完成了一些管理系統。現在,當人們希望提高整個管理水平,建立全集團、全公司的企業級信息管理系統時發現,以往已完成的各部門系統采用的是不同的DBMS,要想統一起來,非常困難,甚至是不可能的。因此,為了保護過去的投資,利用已建立的信息系統,迫切需要一種能訪問多種數據庫的操作平台,以便建立更大、更完備、更全面的企業信息管理系統。

為了適應這種需求,Microsoft推出了開放數據庫互連技術,簡稱ODBC。開放數據庫互連接實際上是一個數據庫訪問庫,它包含訪問不同數據庫所要求的ODBC驅動程序。如要操作Fo xpro數據庫,要用Foxpro的ODBC驅動程序;要訪問DBASE,要用DBase的ODBC驅動程序。總之,應用程序要操作不同類型的數據庫,只要調用ODBC所支持的函數,動態鏈接到不同的驅動程序上即可。隨著ODBC技術的推出,許多開發工具軟件都把ODBC技術集成到自己的軟件中,如,Visu al basic、Visual C++、Power Builder等等。其中,由PowerSoft公司開發的PowerBuilder 是迄今為止最成功的數據庫應用系統開發工具,它利用ODBC技術不僅適應各種數據庫系統,而且采用面向對象的開發方法和可視化的編程環境,使PowerBuilder成為優秀的前端開發工具,日益受到人們的重視。

本文將主要討論在Power Builder中,以不同的方法,應用ODBC技術,去訪問不同的數據庫。

在實際應用中,可能會以幾種不同的方式訪問數據庫:只訪問一個數據庫、在多個數據庫間動態切換、同時需要訪問多個數據庫。這些方式,都可以應用ODBC技術滿足用戶的要求。下面分別討論每種方式應用ODBC具體方法。假定所需要的ODBC驅動程序已經正確安裝。

一、只訪問單一數據庫

這是一種比較簡單的ODBC應用。應用程序只需要訪問單一的數據庫,采用Power Builde r的畫筆,就可以完成相應的ODBC設置。下面以

Foxpro為例,說明這一過程:

1.配置ODBC

·單擊Power Panel上的ODBC畫筆,出現ODBC設置窗口。

·在in stalled driver窗口選中Foxpro Files。

·單擊Create按鈕,出現ODBC Foxpro Setup窗口,在Data source Name欄,定義數據源名,如:C-foxpro。

·選擇Foxpro 2.5。

·選擇Foxpro表所在的目錄及索引文件。

·以上參數定義完後,單擊OK。返回Configure ODBC窗口。

·在數據源框中,可看到剛剛定義的C-Foxpro出現,選中它。

·單擊Done按鈕。此時,ODBC驅動程序及數據源定義完成。

2.連接數據源

·單擊DB PROFILE畫筆,出現Database Profile窗口。

·如果設有與FOxpro相關的PROFILE,單擊NEW,建立一個。建立PROFILE後,返回Databas e Pro-file窗口。選中新定義的PROFILE;如果有,則選擇該PROFILE。

·單擊OK,則建立了與指定數據庫的ODBC連接。

此後,在設計Power Builder的應用程序時,所有對數據庫的操作都連接到Foxpro。在此要特別說明的是,雖然只訪問一種類型的數據庫,但是對於同一個數據庫,可以建立多個數據源。Power Builder規定,每個ODBC數據源必須有一個唯一的名字,可以使用不同的連接參數,使多個數據源連接到同一個數據庫。比如,兩個數據源使用不同的PASSWord和USERID,都連接到Foxpro。

二、在多個數據庫間動態切換

在設計企業級的信息管理系統時,常常會遇到需要訪問不同數據庫系統的問題。比如人事部門的人事檔案是應用Foxpro數據庫系統,財務部門的財務信息是應用DBase數據庫系統, 因此,企業信息管理系統就要求必須具有能夠訪問多種數據庫的能力,而且可以根據程序要求,在多種數據庫間動態切換。應用Power Builder提供的PowerScript設計語言,通過ODBC,可以很方便地達到這個目的。

為了解決應用程序和數據庫之間的通訊,Power-Builder使用一個特殊的對象,這個對象稱作事務對象(TRANSACTION OBJECT)。象所有的對象一樣,事務對象也具有自己的事件、屬性和函數。在使用事務

對象之前,必須先建立對象,並且給事務對象的屬性賦值。ODBC使用事務對象中有兩個重要屬性:DBMS和DbParm。DBMS用來指明要連接的數據源,如果使用ODBC技術,則賦給屬性DBMS的值是"ODBC"。Db-Parm為DBMS的說明性參數,它的值是連接數據庫所需要的參數組成的字符串,該值必須指明DSN(DATA SOURCE NAME)值,DSN值告訴ODBC要存取的數據源。可以說,一個事務對象標識了一個數據庫,因此,它必須在存取該數據庫前就要建立。為了方便用戶的應用,Power Builder還提供了一個全局的缺省事務對象,即每當應用程序啟動時,Power Builder都要自動建立一個稱作SQLCA(SQL COMMUNICATION AREA)的事務對象,不需要用戶建立。當一個應用程序初始啟動時,連接數據庫所需的缺省信息都是存放在初始化文件PB.INI中。

下面是在PB.INI文件中用於與Foxpro數據庫連接的部分。

[Database]

Vendors=ODBC,SYS Sybase system 10

DBMS=ODBC

ServerName=

Database=

UserId=

....

[DBMS_PROFILES]

CURRENT=Foxpro

PROFILES="Foxpro","DBase"

....

[Profile Foxpro]

DBMS=ODBC

DataBase=c:\fox

UserId=Public

DatabasePassWord=

LogpassWord=

ServerName=

DbParm=ConnectString=‘DSN=C_Foxpro;D

BQ=C:\fox;FIL=Foxpro 2.5;

在上述的PB.INI中的Profile Foxpro段,指出了DBMS是ODBC,DbParm指明了要連接的數據源名是C_Foxpro。對於一個ODBC數據庫來說,DbParm字符串包含了連接所需要的全部信息。一般情況下,要在多個數據庫間動態切換,只有一個缺省的SQLCA事務對象就夠了。當需要切換到其它ODBC數據庫時,可以應用Script語言,改變SQLCA事務對象的屬性,完成切換。比如: 當需要切換到DBase數據庫時,可以插入如下Script語句。

SQLCA.DBMS="ODBC"

SQLCA.DbParm="Connectstring=‘DSN=cDBase;DBQ=c:\db4;fil=

DBase4’"

CONNECT USING SQLCA;

當需要再切換到Foxpro時,再插入如下Scrift語句:

SQLCA.DBMS="ODBC"

SQLCA.Dbpram="Connectstring=‘DSN=C_Foxpro;DBQ=C:\fox;FI

L=Foxpro 2.5;’"

CONNECT USING SQLCA;

由於SQLCA是缺省的事務對象,所以CONNECT語句可以不指出事務

對象的名字,只寫CONNE CT即可。

三、同時訪問多個數據庫

當需要在一個應用中同時訪問多個數據庫時,就要用到多個事務對象。可以用SQLCA與一個數據庫連接,但是對於其它的數據庫,每個庫則必須建立一個事務對象。在創建事務對象前,應考慮它的使用范圍,可根據需要聲明為全局對象或實例對象。

下面以在一個應用中需同時操作Foxpro和Access兩種數據庫為例,說明創建事務對象的過程。該例要在同一個數據窗口中同時顯示Foxpro中的AA表和Access中的BB表,PowerScrip t語句如下:

∥聲明事務對象

Transaction Tr_foxpro

Transaction Tr_Access

∥建立事務對象

Tr_foxpro=Create Transaction

Tr_Access=Create Transaction

∥給事務對象的屬性賦值

Tr_foxpro.DBMS="ODBC"

Tr_foxpro.Dbparm="ConnectString=‘DSN=S_foxpro"

Tr_Access.DBMS="ODBC"

Tr_access.Dbparm="ConnectString"=‘DSN=S_Access"

∥建立數據庫連接

Connect Using Tr_foxpro

Connect Using Tr_Access

要在一個窗口中定義二個不同的數據窗口分別對應二個不同的庫,首先要按前述的步驟建立各自的數據源,設數據源名分別為S_foxpro和S_Access。然後在各自的數據源下制作數據窗口。在窗口OPEN事件中寫入如下Script程序:

∥建立數據窗口與事務對象的連接

Dw_1.Settransobject(Tr_foxpro)

Dw_2.Settransobject(Tr_Access)

∥將數據庫中的數據檢索到數據窗口中

Dw_1.RetrIEve()

Dw_2.RetrIEve()

當這個應用程序執行時,就會在兩個數據窗口顯示兩個數據庫的內容,讀者可以仿照以上的方法,設計出同時訪問多個不同數據庫的程序。

以上闡述的是應用ODBC訪問不同數據庫的方法,Power Builder實際上還提供另一種方法訪問數據庫,即專用數據接口,它的使用方法與ODBC有類似之處,讀者可參考本文,理解專用數據接口方法。



ASP賦予你在標准的Html文檔中嵌入腳本的能力。使用這些腳本可執行應用程序邏輯和調用執行特定任務的軟件組件,如數據庫查詢、文件輸入/輸出(I/O)、交易規則和工作流程。ASP將INTERNET數據庫連接器(IDC)的簡單性與ISAPI的靈活性結合在一起,而且由於支持Java虛擬主機,因此可以用多種編程語言編寫ASP應用組件。

CGI是最常用的WEB服務器擴展。CGI可以使你能夠運行在不屬於WEB服務器的應用程序。許多CGI應用程序是用腳本語言編寫的。由於這種語言的可移植性,因此這些語言是擴展WEB服務器性能的流行方法。經過CGI具有靈活性和可移植性,但是由於CGI必須對每個CGI請求重新啟動一個新的進程,所以,PERL應用程序對大流量的WEB站點不是最佳解決方案。在CGI完成對該請求的服務後,將取消該進程以及與它相關的任何信息。現在國內外的虛擬主機服務商,在NT SERVER下已經不提供支持PERL的服務。

ISAPI是由MS創建的作為CGI補充的INTERNET服務器應用程序編程接口,是一組常規可擴展例程,用於調用外部應用程序並處理浏覽器和服務器之間的數據流。
ISAPI是一個開放式規范,WINDOWNS NT和其他操作系統上的第三方WEB服務器支持該規范。通過將ISAPI與IIS和NT SERVER結合,可以創建一個高性能、低成本並且可擴展的超文本傳輸協議(HTTP)平台。ISAPI開發以ISAPI應用程序的形式出現,用於克服CGI性能不足的問題。ISAPI的過濾器可以對傳入和傳出IIS的信息進行預處理和後處理。雖然ISAPI比CGI更快更靈活,但是程序員必須十分熟悉MS VC++開發系統才行。

ODBC IDC是IIS中的另一個可擴展的選項。IDC是一個ISAPI應用程序,它使你可以把WEB頁面與支持ODBC的任何後端數據庫結合。IDC使用簡單的腳本語言創建數據庫連接這個事實使IDC成為特別受歡迎的服務器擴展。了解結構化查詢語言(SQL)可以幫助你創建IDC應用程序頤親亓薓icrosoft的MSDN裡面對ODBC的介紹:
  Mcrosoft推出的ODBC(Open Database Connectivity)技術為異質數據庫的訪問提供了統一的接口。ODBC基於SQL(Structured Query Language),並把它作為訪問數據庫的標准。這個接口提供了最大限度的相互可操作性:一個應用程序可以通過一組通用的代碼訪問不同的數據庫管理系統。一個軟件開發者開發的客戶/服務器應用程序不會被束定於某個特定的數據庫之上。ODBC可以為不同的數據庫提供相應的驅動程序。

  ODBC的靈活性表現在以下幾個方面:

  •    應用程序不會受制於某種專用的API

  •    SQL語句以源代碼的方式直接嵌入在應用程序中

  •    應用程序可以以自己的格式接收和發送數據

  •    ODBC的設計完全和ISO Call-Level Interface兼容

  •    現在的ODBC數據庫驅動程序支持55家公司的數據產品


因為很多朋友不太熟悉ODBC,做了簡單的介紹之後,我們先來解釋一些與ODBC有關的名詞。

  ODBC驅動程序:是一個動態鏈接庫(DLL),用以將特定的開放式數據庫連接的數據源和另一個應用程序(客戶端)相連接。

  ODBC數據源:作為數據源使用的數據庫或數據庫服務器。ODBC數據源通過它們的數據源名稱來引用,或者通過具體引用ODBC驅動程序和服務器名稱來引用。可以在Windows的控制面板中使用ODBC管理程序或rdoRegisterDataSource(一個ODBC API)方法來注冊命名的數據源。

  ODBC驅動程序管理器:提供從主機語言到特定後端數據源驅動程序的接口。

  ODBC API:數據庫廠商為程序設計者提供的直接訪問數據庫的一組函數。注意:這裡要指出的是,雖然ODBC API提供了很多很方便而且強大的功能。但是通常來說ODBC API都比較難學,而且使用很容易出錯。雖然允許用ODBC API來操作ODBC句柄,但還是要小心,如果不正確地使用ODBC API,可能會導致不可預知的錯誤。例如,假如使用ODBC API代碼來關閉連接或釋放這些ODBC句柄中的任何一個,那麼RemoteData控件或RDO的行為將是不可預知的。保存ODBC句柄以供備用也是沒有意義的,因為它們是可變的。   這是使用 win32asm進行數據庫編程系列的第一份教程。在如今的IT界,數據庫編程變的越來越重要,所以我們不能再忽視它。但如今有很多種數據庫在使用,如果我們為了實現win32下數據庫匯編語言編程而學習各種數據庫文件格式,所花時間大概稱得上“永恆”。

幸運的是,Microsoft的一項技術使得我們得以擺脫這個大麻煩。它被稱為ODBC,是開放式數據庫互連(Open Database Connectivity)的縮寫,這是一族API,與Windows API相似。它主要與數據庫打交道。就是說,利用ODBC API,你可通過統一界面和好多各不相同的數據庫打交道。

ODBC是如何工作的?它的結構式怎樣的?在使用ODBC之前,你應對它的結構有一個清楚的了解。 ODBC有四個組成部分:

  • 應用程序 (Application,你的程序)
  • ODBC 管理器 (ODBC manager)
  • ODBC 驅動程序(ODBC Drivers)
  • 數據源 (Data Sources,數據庫)

這四個組件的核心是ODBC 管理器。 你可把它想象成你的監工。你告訴它你希望他作什麼,然後它把你的要求傳達給它的工人(ODBC 驅動程序)並完成工作。如果工人有什麼想告訴你的,它會與監工(ODBC 管理器)說,由監工傳達給你。工人們很明白他們應作什麼,因此他們會為你很好的完成工作。

通過這樣的模式,我們並不與數據庫驅動程序直接通信。你只需告訴數據庫管理器你想要做什麼。而使用恰當的ODBC驅動程序來實現你的目的則是ODBC管理器的事。每個ODBC 驅動程序對於它所對應的數據庫均有足夠了解。各部件各司其職,極大的簡化了工作量。

你的程序<----> ODBC管理器<----> ODBC驅動程序 <----> 數據庫

ODBC管理器由Microsoft提供。看一下你的控制面板。如果你正確地安裝了ODBC你會找到ODBC數據源(32位) 項目。 至於ODBC驅動程序, Microsoft隨他們的產品提供了好幾種。並且你總可從數據庫提供商那裡獲得新的ODBC 驅動程序。只要簡單地安裝新的ODBC驅動程序,你的機器就可使用新的它以前不知道的數據庫。

ODBC APIs 使用很簡單,但你需要知道一些關於SQL和數據庫的知識。例如字段(fIEld),主鍵(Prima(最完善的虛擬主機管理系統)ry key),記錄(record),列(column),行(row)等。我須假定你已知道數據庫理論的一些基礎知識,這樣我才能討論win32下用匯編語言進行ODBC編程的細節問題。正如你所看到的,ODBC 管理器試圖在你的程序裡隱藏實現的細節。這意味著它必須提供某些基本界面來與你的程序和ODBC驅動程序進行通訊。 由於ODBC驅動程序在某些性能方面存在著差異,因此必須存在一種方法,以使得我們的程序能夠知道某個ODBC驅動程序是否支持某一特性。 ODBC定義了被稱為Interface Conformance Levels的三層服務界面。第三層是核心層。任何ODBC驅動程序都要象在第一層和第二層實現功能一樣實現核心層表中的所有特性。從我們的程序的眼光來看, ODBC APIs被分割為這樣的三層。如果某個函數被標為核心的,就意味著你可放心使用而不必擔心它是否為你正使用的ODBC驅動程序支持。如果它是一個第一層或第二層的函數,你就得確認ODBC驅動程序是否支持,然後再使用。你可通過MSDN獲得ODBC APIs的詳細資料。

在編寫代碼之前你應了解一些ODBC的名詞。

  • 環境(Environment). 和字面意思一樣,是一個全局文本用來存取數據。如果你熟悉DAO的話,你可把它想象為一個workspace。它包含應用於所有ODBC session的信息,例如一個session的connections句柄。在用ODBC之前你必須從環境中獲得這個句柄。
  • 連接(Connection). 指定ODBC驅動程序和數據源(數據庫)。你可以在同一環境中同時連接不同的數據庫
  • 語句(Statement). ODBC使用SQL作為自己的語言。 因而只要簡單的認為語句就是你希望ODBC執行的SQL命令就行了。

以下是使用ODBC編程的一般步驟:

  1. 連接數據源
  2. 創建並執行一條或多條SQL語句
  3. 檢查結果記錄(如果有的話)
  4. 斷開數據源

在接下來的教程中我們來學習如何來實現這幾步。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved