Vb快速访问sql数据库的方法

文档序号:6520175阅读:1816来源:国知局
Vb快速访问sql数据库的方法
【专利摘要】本发明为VB快速访问SQL数据库的方法,针对使用VB访问SQL数据库这一具体问题,在VB应用程序中调用ODBCAPI函数,进行数据成组绑定,减少应用程序访闷SQL数据库时数据转换的系统开销和网络传输开销,使应用程序高速访问SQL数据库。
【专利说明】VB快速访问SQL数据库的方法
[0001 ] 一种VB快速访问SQL数据库的方法
本发明针对使用VB访问SQL数据库这一具体问题,在VB应用程序中调用0DBCAPI函数,进行数据成组绑定,减少应用程序访闷SQL数据库时数据转换的系统开销和网络传输开销,使应用程序高速访问SQL数据库。
[0002]为解决上述技术问题,本发明的技术方案是:
由于ODBC API函数的入口参数表中有些参数需要传递指针,而VB不支持指针,因此在VB中调用ODBC API函数受到一定限制。VB的字符串内存存储格式与C语言不同,而ODBC API函数是用C语言开发的,这也限制了 VB和ODBC API函数之间的数据交换。作者对ODBC API函数进行了分析,综合VB的特点,编写一个动态链接库,在动态链接库的支持下可直接在VB中调用ODBC API函数,并能进行数据交换。
[0003]1、VC++6.0开发动态链接库
VC++6.0可开发三种类型的动态链接库:Win32 DLL、常规MFC DLL、扩展MFC DLL。扩展MFC DLL支持C++接 口。换言之,DLL能够导出整个类,客户能够建立这些类或由其派生的类的对象。Win32DLL、常规MFC DLL可被任意Win32编程环境(包括Visual Basic 6.0版)加载使用。常规MFC DLL在发行时必须附带MFC42.DLL库,而Win32DLL可单独发行。如果只提供给VB编程环境使用,可建立Win32 DLL即可。
[0004]2、建立 Win32 DLL
利用VC++6.0编程环境的AppWizard创建一个简单Win32 DLL工程,工程名为VBSQL,在此基础上加入自己的代码。代码如下:
#include “stdafx.h”
#include<string.h>
#def ine DLLEXP0RT extern “C,,_declspec (dllexport)// 定义导出宏
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} ;//将地址强制转换为长整形DLLEXPORT long—stdcall strCopyToByte (char^BytesAddress, char^strAddress)
{
return (long)strcpy (BytesAddress, strAddress)
} ;//将字符串传送到指定地址
经编译链接生成VBSQLDLL动态链接库,将其拷贝到C:\WINDOWS\SYSTEM目录下,这样就可在VB中调用。利用Microsoft Visual Studio 6.0工具软件Depends查看VBSQLDLL中导出的函数名。 [0005]3、VB中声明外部函数在模块文件中作如下声明:
VBSQL.DLL函数声明:
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头文件中常量和函数声明,将其内容转为VB声明格式。由于0DBCAPI函数和常数较多,在此不能——列举。
[0006]类型标识常量:
Public Const SQL—IS—P0INTER=(_4)
Public Const SQL—IS—UINTEGER=(_5)
SQL数据类型常量Public Const SQL—CHAR=1Public Const SQL—FL0AT=6SQL C类型常量
Public Const SQL—C—CHAR=SQL—CHARPublic Const SQL—C—FL0AT=SQL—REAL函数声明
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关键词后的变量按值传送,ByRef关键词后的变量按地址传送。
[0007]4、VB调用外部函数
声明之后,在VB中可像调用其他VB函数一样调用这些函数。注意ODBC API函数的参数表中某些变量是一个VOID类型指针,通过标识常量进行标识。如:
SQLSetStmtAttr函数的第三个参数(SQLPOINTER Value)他即可以传递数值也可以传递地址,通过第四个参数(SQLINTEGER StringLength)进行标识,在VB中为(ValuePtr AsLong)。
[0008]传递数值:CallSQLSetStmtAttr (语句句柄,属性,属性值,SQL_IS_UINTEGER) 传递地址:Call SQLSetStmtAttr (语句句柄,属性,GetAddress (变量),0)
GetAddress取地址按如上规则,在VB中直接调用ODBC API函数。
[0009]与现有技术相比,本发明的有益效果是:
I)、在本系统实际调试中,用ADO更新720个数据大约需I秒的时间。利用本文的方法,在VB中调用ODBC API函数,并进行成组数据绑定,更新同样的数据约为0.1秒,大大加快访问SQL的速度。
[0010]2)、“基于虚拟现实的轮机模拟器”是以SQL数据库为中心的分布式仿真系统。本系统由I台SQL数据库服务器、14台子系统仿真计算机(客户机、配电盘工控机、机控台工控机、教练员计算机(监控机)和15台学生用计算机,通过100M网络交换机组成快速以太网。子系统需将实时仿真数据高速上载给数据库,其它子系统和学生机也需高速下载所需仿真数据。因此如何加快访问数据库,减少网络流量,各子系统实时高速交换仿真数据是本分布式仿真系统成功的关键。该发明使得模拟器各个系统之间的快速访问得以实现。
【权利要求】
1.由于ODBC API函数的入口参数表中有些参数需要传递指针,而VB不支持指针,因此在VB中调用ODBC API函数受到一定限制;VB的字符串内存存储格式与C语言不同,而ODBC API函数是用C语言开发的,这也限制了 VB和ODBC API函数之间的数据交换;作者对ODBC API函数进行了分析,综合VB的特点,编写一个动态链接库,在动态链接库的支持下可直接在VB中调用ODBC API函数,并能进行数据交换;VC++6.0开发动态链接库VC++6.0可开发三种类型的动态链接库:Win32 DLL、常规MFC DLL、扩展MFC DLL ;扩展MFC DLL支持C++接口 ;换言之,DLL能够导出整个类,客户能够建立这些类或由其派生的类的对象;Win32DLL、常规MFC DLL可被任意Win32编程环境(包括Visual Basic 6.0版)加载使用;常规MFC DLL在发行时必须附带MFC42.DLL库,而Win32DLL可单独发行;如果只提供给VB编程环境使用,可建立Win32 DLL即可;建立 Win32 DLL利用VC++6.0编程环境的AppWizard创建一个简单Win32 DLL工程,工程名为VBSQL,在此基础上加入自己的代码;代码如下:#include “stdafx.h” #include<string.h>#def ine DLLEXPORT extern “C,,_declspec (dllexport)// 定义导出宏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} ;//将地址强制转换为长整形DLLEXPORT long—stdcall strCopyToByte(char*BytesAddress, char*strAddress){return (long)strcpy(BytesAddress, strAddress)} ;//将字符串传送到指定地址经编译链接生成VBSQLDLL动态链接库,将其拷贝到C: \WINDOWS\SYSTEM目录下,这样就可在VB中调用;利用Microsoft Visual Studio 6.0工具软件Depends查看VBSQLDLL中导出的函数名;VB中声明外部函数 在模块文件中作如下声明: VBSQL.DLL函数声明: 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头文件中常量和函数声明,将其内容转为VB声明格式; 由于0DBCAPI函数和常数较多,在此不能—列举; 类型标识常量:
Public Const SQL_IS_P0INTER=(-4)
Public Const SQL_IS_UINTEGER=(-5) SQL数据类型常量 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
函数声明
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关键词后的变量按值传送,ByRef关键词后的变量按地址传送; VB调用外部函数 声明之后,在VB中可像调用其他VB函数一样调用这些函数;注意ODBC API函数的参数表中某些变量是一个VOID类型指针,通过标识常量进行标识;如: SQLSetStmtAttr函数的第三个参数(SQLPOINTER Value)他即可以传递数值也可以传递地址,通过第四个参数(SQLINTEGER StringLength)进行标识,在VB中为(ValuePtr AsLong);传递数值:Call SQLSetStmtAttr (语句句柄,属性,属性值,SQL_IS_UINTEGER)传递地址:Call SQLSetStmtAttr (语句句柄,属性,GetAddress(变量),0)GetAddress取地址按如上规 则,在VB中直接调用ODBC API函数。
【文档编号】G06F17/30GK103646047SQ201310594905
【公开日】2014年3月19日 申请日期:2013年11月25日 优先权日:2013年11月25日
【发明者】刘雨 申请人:大连海联自动控制有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1