設計Microsoft Windows NT操作系統上的32位SQL Server 應用程序
Christopher Moffatt
Microsoft Technical Resources Group
摘要
Microsoft® Windows NT™操作系統是建立充滿活力、功能豐富的Microsoft SQL Server應用程序的一個完美的平台。SQL Server Programmer's Toolkit for Windows NT(SQL Server 程序員Windows NT工具包)含有DB-Library™的32位(Win32™ API)版本,使得開發Windows NT操作系統上的用於Microsoft SQL Server的DB-Library客戶端程序成為可能。
這篇技術文章用於將DB-Library開發人員引入到Microsoft Windows NT平台上,討論的問題包括將已有的Windows™ 3.x和OS/2®操作系統平台上的DB-Library應用程序轉換到Windows NT操作系統,並對DB-Library應用程序如何利用Win32應用程序編程接口(API,application programming interface)的一些方法進行了概要說明。
本篇技術文章假定你已熟悉DB-Library API、C語言編程以及下列內容:
· Microsoft SQL Server Programmer's Reference for C
· Microsoft Win32 API Programmer's Reference, 第1、2卷
· Converting OS/2 Applications to Windows
建立基於Win32的DB-Library應用程序
下面的章節描述了有關使用Microsoft® Win32™應用程序編程接口(API,Application Programming Interface)建立DB-Library™應用程序的應用。
Win32 DB-Library體系結構
在內部機制上,Win32的DB-Library動態鏈接庫(DLL,dynamic-link library)與OS/2®上的實現方式類似。與在OS/2的一樣,在Win32中一個獨立的操作系統線程(thread)處理每次DB-Library所發出的與SQL Server的聯接。通過調用一個進程(process)所裝入的每個DB-Library DLL實例(instance)在共享代碼的同時得到了一個私有數據區。
Win32 DB-Library體系結構與在Microsoft Windows™ 3. x中的實現方式不同。在Windows 3.x中,DB-Library DLL只有一個被所有調用的進程共享的數據段。W3DBLIB.DLL通過對單一數據段的聯接的一個鏈接式列表維護DB-Library聯接。這種體系結構是需要的,因為在Windows 3.x動態鏈接庫只有一個被所有調用進程共享的數據段。這樣就必須通過調用dbinit和dbwinexit函數初始化和清除DB-Library DLL數據結構。
庫
Win32的DB-Library函數包含於NTWDBLIB.DLL中,而命名管道(named pipe)驅動程序包含在DBNMPNTW.DLL中。應設置PATH環境變量包含這些動態鏈接庫所在的目錄。
另一個文件,NTWDBLIB.LIB,包含了你的應用程序使用Win32 API的引入(import)定義。應設置LIB環境變量包含NTWDBLIB.LIB所在的目錄。
包含文件
SQL Server Programmer's Toolkit for Windows NT™提供了下列包含文件:
包含文件
內容
SQLFRONT.H
錯誤代碼和嚴重級(severity levels),混合定義(miscellaneous definitions),和類型定義。
SQLDB.H
所有DB-Library函數的函數原型
你可以在INCLUDE環境變量中添加路徑,包含這些包含文件所在的目錄。或者你也可以使用/I編譯行開關指向包含文件所在的目錄。
因為你的使用Win32 API的應用程序必須包含SQLDB.H文件,所以你不需要定義所使用的DB-Library函數。這些函數和它們的正確定義已包含在該包含文件中。你必須在包含DB-Library 包含文件之前定義一個應用程序的操作系統。在所有使用Win32 API設計的DB-Library應用程序的開頭包含下列語句;
#define DBNTWIN32
#include <sqlfront.h>
#include <sqldb.h>
你還能通過使用/D編譯行參數定義操作系統(例如,使用/DDBNTWIN32 而不是通過一個#define定義)。
編譯和鏈接
下面的例程顯示了一個簡單的build文件。該文件使用NMAKE工具編譯和鏈接可調試的使用Win32 API的DB-Library應用程序:
NTLIB= tsdklibi386
DBLIB=sqldbliblib
guilibs= $(NTLIB)gdi32.lib $(NTLIB)user32.lib $(NTLIB)
userrtl.lib $(NTLIB)kernel32.lib $(NTLIB) tdll.lib
$(NTLIB)libcmt.lib
all: sqltestw.exe
# Update the object file if necessary.
sqltestw.obj: sqltestw.c sqltestw.h sqltestw.rc makefile
cl386 -c -G3d -Di386=1 -DWIN32 sqltest.c
# Update the resource file if necessary.
sqltestw.res: sqltestw.rc sqltestw.h dilaogs.h dialogs.dlg makefile
rc -r -fo sqltestw.tmp sqltest.rc
cvtres -i386 sqltestw.tmp -O sqltestw.res
del sqltestw.tmp
# Update the exe file if necessary.
sqltestw.exe: sql.obj sqltestw.obj sqltestw.res makefile
link -Machine:i386 -subsystem:Windows -out:sqltestw.exe
-entry:WinMainCRTStartup
sqltestw.res sqltestw.obj $(guilibs)
($DBLIB) twdblib.lib
將基於Windows 3.x的DB-Library應用程序轉換到Win32環境
所有的DB-Library函數都完全能夠在平台間轉換。你不需要更改你的任何DB-Library調用。你僅僅需要在編譯時定義應用程序的操作系統(例如, 對於Windows NT為#define DBNTWIN32)。
因為Win32 API保持了與Windows 3.x操作系統的兼容性,所以Win32 DB-Library DLL支持所有基於Windows 3.x的DB-Library函數,即使這些函數不需要也是如此。在Windows 3.x出現而在Windows NT中並不需要的DB-Library函數(例如,DBLOCKLIB和DBUNLOCKLIB)可以被使用,但不執行任何操作。
兩個DB-Library函數,dbprhead和dbprrow,由於發送輸出到STDIO而在Windows 3.x並不被支持,但在Win32中它們能夠被支持並用於開發CONSOLE子系統應用程序。dbprhead和dbprrow函數提供了一種簡便的方式將查詢結果顯示到默認輸出設備。
如果你希望使已有的基於Windows的DB-Library應用程序能夠在Windows NT上運行,你可以采取三種方法:
· 將你的16位Windows 3.x應用程序不加改變的運行於Windows 3.x子系統. 如果你已有Windows 3.x應用程序,你完全不必甚至將來也不需要進行改動,只需要不加改變的運行即可。
· 更改你的應用程序源代碼以便其能被編譯用於Win32 API或Windows 3.x. 如果你的DB-Library應用程序正在開發或正在改進以滿足不斷改變的用戶需要,以及你希望在Windows 3.x和Windows NT上運行應用程序,從相同的源代碼略微進行改動以建立你的16位(Windows 3.x)版本和32位(Win32)版本的應用程序。
· 將你的應用程序源代碼完全轉換到Win32. 如果你決定更改你的應用程序只作為32位 (基於Win32)應用程序運行(例如,你需要諸如線程和搶先多任務(preemptive multitasking)等Win32特性),你可以將你的應用程序轉換到Win32 API上,並刪除冗余的Windows 3.x調用和依賴。
在保持DB-Library對Windows 3.x兼容基礎上進行轉換
本章節解釋了如何將用於Windows 3.x的DB-Library應用程序轉換到Windows NT操作系統,而同時保持與Windows 3.x應用程序的兼容性。
用於Windows 3.x和C運行時態的API調用
一般而言,你可以改變你的代碼輕而易舉地建立16位或32位版的應用程序。對於更深入的討論編寫使用Win32 API的且保留了與Windows 3.x兼容性的應用程序,請參閱Microsoft Win32 API Programmer's Reference第1卷
下面是使用Win32 API的應用程序開發指導方針:
· 函數定義與原型.確保你的函數定義和函數原型使用了可轉換的數據類型。
· Windows 消息參數封裝.處理擴寬到32位意味著處理的封裝、其它wParam和lParam中的值已經改變。檢驗你是否需要改變你的應用程序中的wParam和lParam編碼。
DB-Library函數和數據類型
所有的DB-Library函數都完全能在操作系統間轉換。你只需要在編譯的時候定義目標操作系統即可。
許多DB-Library函數的返回值為int型。要注意int數據類型在Windows 3.x中是16位值而在Win32 API中則是32位值。因此,對你的應用程序進行檢查以使用正確的變量類型接收返回int數據類型的DB-Library函數所返回的值。例如,一個定義為short數據類型的變量在Windows 3.x中可以從DB-Library接收到正確的int值而在Win32 API中則接收到錯誤的值。
除了檢驗接收DB-Library的返回值的變量類型是正確的以外,不需要對DB-Library函數做任何改動。
轉換的其它考慮
如果你要將Windows 3.x操作系統的一個應用程序轉換到Windows NT操作系統上而不需要保持與Windows 3.x的兼容性,你可以改變你的DB-Library代碼,刪除冗余或不必要的Windows 3.x函數。
冗余的Windows 3.x專用DB-Library函數