Vb快速訪問sql數(shù)據(jù)庫的方法
【專利摘要】本發(fā)明為VB快速訪問SQL數(shù)據(jù)庫的方法,針對使用VB訪問SQL數(shù)據(jù)庫這一具體問題,在VB應(yīng)用程序中調(diào)用ODBCAPI函數(shù),進(jìn)行數(shù)據(jù)成組綁定,減少應(yīng)用程序訪悶SQL數(shù)據(jù)庫時數(shù)據(jù)轉(zhuǎn)換的系統(tǒng)開銷和網(wǎng)絡(luò)傳輸開銷,使應(yīng)用程序高速訪問SQL數(shù)據(jù)庫。
【專利說明】VB快速訪問SQL數(shù)據(jù)庫的方法
[0001 ] 一種VB快速訪問SQL數(shù)據(jù)庫的方法
本發(fā)明針對使用VB訪問SQL數(shù)據(jù)庫這一具體問題,在VB應(yīng)用程序中調(diào)用0DBCAPI函數(shù),進(jìn)行數(shù)據(jù)成組綁定,減少應(yīng)用程序訪悶SQL數(shù)據(jù)庫時數(shù)據(jù)轉(zhuǎn)換的系統(tǒng)開銷和網(wǎng)絡(luò)傳輸開銷,使應(yīng)用程序高速訪問SQL數(shù)據(jù)庫。
[0002]為解決上述技術(shù)問題,本發(fā)明的技術(shù)方案是:
由于ODBC API函數(shù)的入口參數(shù)表中有些參數(shù)需要傳遞指針,而VB不支持指針,因此在VB中調(diào)用ODBC API函數(shù)受到一定限制。VB的字符串內(nèi)存存儲格式與C語言不同,而ODBC API函數(shù)是用C語言開發(fā)的,這也限制了 VB和ODBC API函數(shù)之間的數(shù)據(jù)交換。作者對ODBC API函數(shù)進(jìn)行了分析,綜合VB的特點,編寫一個動態(tài)鏈接庫,在動態(tài)鏈接庫的支持下可直接在VB中調(diào)用ODBC API函數(shù),并能進(jìn)行數(shù)據(jù)交換。
[0003]1、VC++6.0開發(fā)動態(tài)鏈接庫
VC++6.0可開發(fā)三種類型的動態(tài)鏈接庫:Win32 DLL、常規(guī)MFC DLL、擴展MFC DLL。擴展MFC DLL支持C++接 口。換言之,DLL能夠?qū)С稣麄€類,客戶能夠建立這些類或由其派生的類的對象。Win32DLL、常規(guī)MFC DLL可被任意Win32編程環(huán)境(包括Visual Basic 6.0版)加載使用。常規(guī)MFC DLL在發(fā)行時必須附帶MFC42.DLL庫,而Win32DLL可單獨發(fā)行。如果只提供給VB編程環(huán)境使用,可建立Win32 DLL即可。
[0004]2、建立 Win32 DLL
利用VC++6.0編程環(huán)境的AppWizard創(chuàng)建一個簡單Win32 DLL工程,工程名為VBSQL,在此基礎(chǔ)上加入自己的代碼。代碼如下:
#include “stdafx.h”
#include<string.h>
#def ine DLLEXP0RT extern “C,,_declspec (dllexport)// 定義導(dǎo)出宏
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,
LPVOID IpReserved)
{ switch (ul_reason_for_call)
{
case DLL_PR0CESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PR0CESS_DETACH:
break ;
}
return TURE ;
}
DLLEXPORT long_stdcall GetAddress (void*Address)//按地址傳送 { return (long) Address} ;//將地址強制轉(zhuǎn)換為長整形DLLEXPORT long—stdcall strCopyToByte (char^BytesAddress, char^strAddress)
{
return (long)strcpy (BytesAddress, strAddress)
} ;//將字符串傳送到指定地址
經(jīng)編譯鏈接生成VBSQLDLL動態(tài)鏈接庫,將其拷貝到C:\WINDOWS\SYSTEM目錄下,這樣就可在VB中調(diào)用。利用Microsoft Visual Studio 6.0工具軟件Depends查看VBSQLDLL中導(dǎo)出的函數(shù)名。 [0005]3、VB中聲明外部函數(shù)在模塊文件中作如下聲明:
VBSQL.DLL函數(shù)聲明:
Public Declare GetAddress Lib “VBSQL.DLL” Alias GetAddress@4,,(ByRefAddress as Any) as Long
Public Declare strCopyToByte Lib “VBSQL.DLL” Alias strCopyToByte@8”(ByRefByte ArrayAdd ress as Any) as Long
參考sql.h,sqltypes.h頭文件中常量和函數(shù)聲明,將其內(nèi)容轉(zhuǎn)為VB聲明格式。由于0DBCAPI函數(shù)和常數(shù)較多,在此不能——列舉。
[0006]類型標(biāo)識常量:
Public Const SQL—IS—P0INTER=(_4)
Public Const SQL—IS—UINTEGER=(_5)
SQL數(shù)據(jù)類型常量Public Const SQL—CHAR=1Public Const SQL—FL0AT=6SQL C類型常量
Public Const SQL—C—CHAR=SQL—CHARPublic Const SQL—C—FL0AT=SQL—REAL函數(shù)聲明
Public Declare Function SQLSetStmtAttr Lib “odbe32.dll”
(ByVal StatementHandle As Long, ByVal Attributes As Long, ByVal ValuePtr AsLong.ByVal StringLength As Long)As Integer
Public Declare Function SQLBindParame Lib “odbe32.dll”
(ByVal StatementHandle As Long, ByVal ParameterNumber As Integer, ByValInputoutput Type As Integer, ByVal ValueType As Integer, ByVal ParameterNumberAs Integer, ByVal ColumnSize As Long, ByVal DecimalDigits As Integer, ByRefParameter ValuePtr As Any, ByVal BufferLength As Long, ByRef StrLen_or_IndPtrAs Any)As Intrger
Public Declare Function SQLExecDirect Lib “odbc32.dl1” (ByValStatementHandle As Long, ByVal StatementText As String, ByVal TextLength Aslong)As Long
Public Declare Function SQLEXecute Lib “odbc32.dll,,(ByVal StatementHandleAs long)As Long
其中ByVal關(guān)鍵詞后的變量按值傳送,ByRef關(guān)鍵詞后的變量按地址傳送。
[0007]4、VB調(diào)用外部函數(shù)
聲明之后,在VB中可像調(diào)用其他VB函數(shù)一樣調(diào)用這些函數(shù)。注意ODBC API函數(shù)的參數(shù)表中某些變量是一個VOID類型指針,通過標(biāo)識常量進(jìn)行標(biāo)識。如:
SQLSetStmtAttr函數(shù)的第三個參數(shù)(SQLPOINTER Value)他即可以傳遞數(shù)值也可以傳遞地址,通過第四個參數(shù)(SQLINTEGER StringLength)進(jìn)行標(biāo)識,在VB中為(ValuePtr AsLong)。
[0008]傳遞數(shù)值:CallSQLSetStmtAttr (語句句柄,屬性,屬性值,SQL_IS_UINTEGER) 傳遞地址:Call SQLSetStmtAttr (語句句柄,屬性,GetAddress (變量),0)
GetAddress取地址按如上規(guī)則,在VB中直接調(diào)用ODBC API函數(shù)。
[0009]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
I)、在本系統(tǒng)實際調(diào)試中,用ADO更新720個數(shù)據(jù)大約需I秒的時間。利用本文的方法,在VB中調(diào)用ODBC API函數(shù),并進(jìn)行成組數(shù)據(jù)綁定,更新同樣的數(shù)據(jù)約為0.1秒,大大加快訪問SQL的速度。
[0010]2)、“基于虛擬現(xiàn)實的輪機模擬器”是以SQL數(shù)據(jù)庫為中心的分布式仿真系統(tǒng)。本系統(tǒng)由I臺SQL數(shù)據(jù)庫服務(wù)器、14臺子系統(tǒng)仿真計算機(客戶機、配電盤工控機、機控臺工控機、教練員計算機(監(jiān)控機)和15臺學(xué)生用計算機,通過100M網(wǎng)絡(luò)交換機組成快速以太網(wǎng)。子系統(tǒng)需將實時仿真數(shù)據(jù)高速上載給數(shù)據(jù)庫,其它子系統(tǒng)和學(xué)生機也需高速下載所需仿真數(shù)據(jù)。因此如何加快訪問數(shù)據(jù)庫,減少網(wǎng)絡(luò)流量,各子系統(tǒng)實時高速交換仿真數(shù)據(jù)是本分布式仿真系統(tǒng)成功的關(guān)鍵。該發(fā)明使得模擬器各個系統(tǒng)之間的快速訪問得以實現(xiàn)。
【權(quán)利要求】
1.由于ODBC API函數(shù)的入口參數(shù)表中有些參數(shù)需要傳遞指針,而VB不支持指針,因此在VB中調(diào)用ODBC API函數(shù)受到一定限制;VB的字符串內(nèi)存存儲格式與C語言不同,而ODBC API函數(shù)是用C語言開發(fā)的,這也限制了 VB和ODBC API函數(shù)之間的數(shù)據(jù)交換;作者對ODBC API函數(shù)進(jìn)行了分析,綜合VB的特點,編寫一個動態(tài)鏈接庫,在動態(tài)鏈接庫的支持下可直接在VB中調(diào)用ODBC API函數(shù),并能進(jìn)行數(shù)據(jù)交換;VC++6.0開發(fā)動態(tài)鏈接庫VC++6.0可開發(fā)三種類型的動態(tài)鏈接庫:Win32 DLL、常規(guī)MFC DLL、擴展MFC DLL ;擴展MFC DLL支持C++接口 ;換言之,DLL能夠?qū)С稣麄€類,客戶能夠建立這些類或由其派生的類的對象;Win32DLL、常規(guī)MFC DLL可被任意Win32編程環(huán)境(包括Visual Basic 6.0版)加載使用;常規(guī)MFC DLL在發(fā)行時必須附帶MFC42.DLL庫,而Win32DLL可單獨發(fā)行;如果只提供給VB編程環(huán)境使用,可建立Win32 DLL即可;建立 Win32 DLL利用VC++6.0編程環(huán)境的AppWizard創(chuàng)建一個簡單Win32 DLL工程,工程名為VBSQL,在此基礎(chǔ)上加入自己的代碼;代碼如下:#include “stdafx.h” #include<string.h>#def ine DLLEXPORT extern “C,,_declspec (dllexport)// 定義導(dǎo)出宏BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,LPVOID IpReserved){ switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break ;}return TURE ;}DLLEXPORT long_stdcall GetAddress (void*Address)//按地址傳送{ return (long) Address} ;//將地址強制轉(zhuǎn)換為長整形DLLEXPORT long—stdcall strCopyToByte(char*BytesAddress, char*strAddress){return (long)strcpy(BytesAddress, strAddress)} ;//將字符串傳送到指定地址經(jīng)編譯鏈接生成VBSQLDLL動態(tài)鏈接庫,將其拷貝到C: \WINDOWS\SYSTEM目錄下,這樣就可在VB中調(diào)用;利用Microsoft Visual Studio 6.0工具軟件Depends查看VBSQLDLL中導(dǎo)出的函數(shù)名;VB中聲明外部函數(shù) 在模塊文件中作如下聲明: VBSQL.DLL函數(shù)聲明: Public Declare GetAddress Lib “VBSQL.DLL” Alias GetAddress@4”(ByRefAddress as Any) as Long Public Declare StrCopyToByte Lib “VBSQL.DLL” Alias strCopyToByte@8”(ByRefByte ArrayAdd ress as Any) as Long 參考sql.h,sqltypes.h頭文件中常量和函數(shù)聲明,將其內(nèi)容轉(zhuǎn)為VB聲明格式; 由于0DBCAPI函數(shù)和常數(shù)較多,在此不能—列舉; 類型標(biāo)識常量:
Public Const SQL_IS_P0INTER=(-4)
Public Const SQL_IS_UINTEGER=(-5) SQL數(shù)據(jù)類型常量 Public Const SQL_CHAR=1 Public Const SQL_FL0AT=6 SQL C類型常量
Public Const SQL _C_CHAR=SQL_CHAR
Public Const SQL_C_FLOAT=SQL_REAL
函數(shù)聲明
Public Declare Function SQLSetStrntAttr Lib “odbe32.dll”
(ByVal StatementHandle As Long, ByVal Attributes As Long, ByVal ValuePtr AsLong.ByVal StringLength As Long)As Integer
Public Declare Function SQLBindParame Lib “odbe32.dll”
(ByVal StatementHandle As Long, ByVal ParameterNumber As Integer, ByValInputoutput Type As Integer, ByVal ValueType As Integer, ByVal ParameterNumberAs Integer, ByVal ColumnSize As Long, ByVal DecimalDigits As Integer, ByRefParameter ValuePtr As Any, ByVal BufferLength As Long, ByRef StrLen_or_IndPtrAs Any)As Intrger Pub lie Declare Function SQLExecDirect Lib “odbc32.dlI”(ByValStatementHandle As Long, ByVal StatementText As String, ByVal TextLength Aslong)As Long
Public Declare Function SQLEXecute Lib “odbc32.dll”(ByVal StatementHandleAs long)As Long 其中ByVal關(guān)鍵詞后的變量按值傳送,ByRef關(guān)鍵詞后的變量按地址傳送; VB調(diào)用外部函數(shù) 聲明之后,在VB中可像調(diào)用其他VB函數(shù)一樣調(diào)用這些函數(shù);注意ODBC API函數(shù)的參數(shù)表中某些變量是一個VOID類型指針,通過標(biāo)識常量進(jìn)行標(biāo)識;如: SQLSetStmtAttr函數(shù)的第三個參數(shù)(SQLPOINTER Value)他即可以傳遞數(shù)值也可以傳遞地址,通過第四個參數(shù)(SQLINTEGER StringLength)進(jìn)行標(biāo)識,在VB中為(ValuePtr AsLong);傳遞數(shù)值:Call SQLSetStmtAttr (語句句柄,屬性,屬性值,SQL_IS_UINTEGER)傳遞地址:Call SQLSetStmtAttr (語句句柄,屬性,GetAddress(變量),0)GetAddress取地址按如上規(guī) 則,在VB中直接調(diào)用ODBC API函數(shù)。
【文檔編號】G06F17/30GK103646047SQ201310594905
【公開日】2014年3月19日 申請日期:2013年11月25日 優(yōu)先權(quán)日:2013年11月25日
【發(fā)明者】劉雨 申請人:大連海聯(lián)自動控制有限公司