用VB访问SQL Server数据库技术详解
查看( 1270 ) /
评论( 3 )
本文讨论了Visual Basic应用程序访问SQL Server数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法性能和优缺点。 DOIT博客T
uW'Vs'y${
DOIT博客umx|Z
一、引言 DOIT博客'_ Bz&M*?1]-D&q
cz"@$m-v(qi7S]0
E1d}/n/z~ X\#K0 SQL Server是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQL Server网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。创建维护数据库的工作可用SQL Server提供的SQL Enterprise Manager工具来进行,如能提供一种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。
*j Z"G#E]3y!j0
3X5C^gAa e2X%?0
n5D"S5C3f|2}0 Visual Basic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集,因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端,与后端的Microsoft SQL Server相结合,VB能够提供一个高性能的客户机—服务器方案。
q`1G/pAh9\`0 DOIT博客,}F%^b-},k d9xb7S8H
DOIT博客&O6rLQsn
二、VB访问SQL Server数据的常用方法 DOIT博客~L RP!w,_d1V
DOIT博客/{q2K7^H4D M;d
DOIT博客-r[(dGG?;qK/R3i
使用Visual Basic作为前端开发语言,与SQL Server接口有几种常用的方法,即:
jp[2V,`V6jL0
OM1j { q0
] L!cH`$gn0 ①数据访问对象/Jet
"xY2n'G H%LyP0 DOIT博客/{N4r&m6H0@C zM
A!X-c,nIKu%h5P0 ②为ODBC API编程 DOIT博客Kn~0R RG h
"Q_@+w t2xp E0 DOIT博客r1d4r3cg(c]EQ
③使用SQL Server的Visual Basic库(VBSQL)为DB库的API编程
j,}6I{ A$I0 DOIT博客;g.snQ Oq@
;_xE;df,\!E^0 ④RDO 远程数据对象(RemoteData Objects) DOIT博客z+Zuh#j$L YY
/RSuY'IL\+W,@oU0
`GUaD'`aLb0 ⑤ADO 数据对象(Active Data Objects) DOIT博客 b!}ecS:H/n7wf
,b$Jq w\*TIL K0
"e T ^b6L2V#Ka}Y0 1、数据访问对象/Jet
}%EOBV/w"tt0
aQI6urB"j)T~j0
"L eZ"Q7_I;A*Ug KF0 VB支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它的确有许多优点。DAO/Jet是为了实现从VB访问Access数据库而开发的程序接口对象。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通过调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。DOIT博客4m4vx4]uB
DOIT博客A4m~`I{~&v
w*}Xc IW0 2、利用ODBC API编程 DOIT博客!EEcPZI!BA;H
DOIT博客:d \2R+h*~ K.kqS
DOIT博客Y k] p,WI6K%b
ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVR.DLL)把它们送到服务器中。 DOIT博客'x${u8j^w
DOIT博客.S6X5HJ.MC3^9^5i
DOIT博客 R"z[ ^ ~#i
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。
6^4n_.Q'WN2E*c gRB}I0
,zw0C;Bh/}9^7c~0
EoM%M7@X-ZuQ0
!FK6]z6V@2C0 DOIT博客L p.Q r5h
DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:
4D| ?EK B0 DOIT博客(g*FF_A1d}:W&h1W
VBSQL.VBX: 包含库函数,具有访问重要的消息和处理错误的能力
R9OD;G8b0 DOIT博客F3oAE+h4IV ?nzP
VBSQL.BI:包括所有的常量和变量说明 DOIT博客'o_5Q1L7Ilc
0Q UzF"[-[ c.x'}3j&}A0 VBSQL.HLP:Windows帮助文件,使用VBSQL的指南
&RIc]\T:\dxJi0 DOIT博客c'DBu9b
使用VBSQL时,必须将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBSQL.VBX文件。 DOIT博客!t\0Z/`6d)X
}%\i} Fm0 一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。DOIT博客 dv8tJ dbF
~ G-_X+ob0
DOIT博客umx|Z
一、引言 DOIT博客'_ Bz&M*?1]-D&q
cz"@$m-v(qi7S]0
E1d}/n/z~ X\#K0 SQL Server是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQL Server网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。创建维护数据库的工作可用SQL Server提供的SQL Enterprise Manager工具来进行,如能提供一种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。
*j Z"G#E]3y!j0
3X5C^gAa e2X%?0
n5D"S5C3f|2}0 Visual Basic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集,因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端,与后端的Microsoft SQL Server相结合,VB能够提供一个高性能的客户机—服务器方案。
q`1G/pAh9\`0 DOIT博客,}F%^b-},k d9xb7S8H
DOIT博客&O6rLQsn
二、VB访问SQL Server数据的常用方法 DOIT博客~L RP!w,_d1V
DOIT博客/{q2K7^H4D M;d
DOIT博客-r[(dGG?;qK/R3i
使用Visual Basic作为前端开发语言,与SQL Server接口有几种常用的方法,即:
jp[2V,`V6jL0
OM1j { q0
] L!cH`$gn0 ①数据访问对象/Jet
"xY2n'G H%LyP0 DOIT博客/{N4r&m6H0@C zM
A!X-c,nIKu%h5P0 ②为ODBC API编程 DOIT博客Kn~0R RG h
"Q_@+w t2xp E0 DOIT博客r1d4r3cg(c]EQ
③使用SQL Server的Visual Basic库(VBSQL)为DB库的API编程
j,}6I{ A$I0 DOIT博客;g.snQ Oq@
;_xE;df,\!E^0 ④RDO 远程数据对象(RemoteData Objects) DOIT博客z+Zuh#j$L YY
/RSuY'IL\+W,@oU0
`GUaD'`aLb0 ⑤ADO 数据对象(Active Data Objects) DOIT博客 b!}ecS:H/n7wf
,b$Jq w\*TIL K0
"e T ^b6L2V#Ka}Y0 1、数据访问对象/Jet
}%EOBV/w"tt0
aQI6urB"j)T~j0
"L eZ"Q7_I;A*Ug KF0 VB支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它的确有许多优点。DAO/Jet是为了实现从VB访问Access数据库而开发的程序接口对象。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通过调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。DOIT博客4m4vx4]uB
DOIT博客A4m~`I{~&v
CODE:
注释:Form Declarations DOIT博客
b0f7o7U}:qwq
DOIT博客qFfY9Is/Vc
Dim mydb As Database DOIT博客qItK3I*yt
Dim mydynaset As Dynaset オ DOIT博客3v!nw(k-Y(JG
Private Sub Form_Load()
#kO`z*dlZ0 Set mydb = OpenDatabase("", False, False, "ODBC; DSN=Myserver; WSID=LCL; DATABASE = sales")
uvf.i:[6S\;b4UG0 Set mydynaset = mydb CreateDynaset("Select*from Customers") オ
D1Sr5?3@ OBCM0 End Sub
上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。DOIT博客(k'O,GNi,v/dDOIT博客qFfY9Is/Vc
Dim mydb As Database DOIT博客qItK3I*yt
Dim mydynaset As Dynaset オ DOIT博客3v!nw(k-Y(JG
Private Sub Form_Load()
#kO`z*dlZ0 Set mydb = OpenDatabase("", False, False, "ODBC; DSN=Myserver; WSID=LCL; DATABASE = sales")
uvf.i:[6S\;b4UG0 Set mydynaset = mydb CreateDynaset("Select*from Customers") オ
D1Sr5?3@ OBCM0 End Sub
w*}Xc IW0 2、利用ODBC API编程 DOIT博客!EEcPZI!BA;H
DOIT博客:d \2R+h*~ K.kqS
DOIT博客Y k] p,WI6K%b
ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVR.DLL)把它们送到服务器中。 DOIT博客'x${u8j^w
DOIT博客.S6X5HJ.MC3^9^5i
DOIT博客 R"z[ ^ ~#i
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。
6^4n_.Q'WN2E*c gRB}I0
,zw0C;Bh/}9^7c~0
CODE:
Global giHEnv As Long DOIT博客Lib1[5c
Global giHDB As Long DOIT博客'lO:N1B iT
Global giHStmt As Long
$} }Y^Vz0 DOIT博客C"a.o!S'g8XvR
Dim myResult As integer DOIT博客9S@aJVO
Dim myConnection As Srting
D+H:`%p|6YIW0 Dim myBuff As String*256
|(ej1fC9T0 Dim myBufflen As Integer
:_Pr5w`*@%y?7Y0
/k8C%l"z+Y3F+X.w K0 If SQLAllocEnv(giHEnv)<>SQL_SUCCESS Then
O`e:GFk5t'O)Q?m6f0 MsgBox"Allocation couldn注释:t happen!"
-E/S(F4B"K]S0 End If DOIT博客3[4A,b-PN Fi&eu_
If SQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then DOIT博客*w:K!t'p1Fy&e
MsgBox "SQL Server couldn注释:t connect!" DOIT博客 uRDN5|%YI
End If DOIT博客rlql6JL
myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
c9y{4i t*RD!a8s.]7A G(q0 myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),DOIT博客l6M"a-j'MCnG
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQU IE D)
5b+H?}v{y1vRw0 myResult=SQLAllocStmt(giHDS,giHStmt) DOIT博客-xg gV4l\'e
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
@Iu;WS0 rsSQL="Select * from Customers Where City = "Hunan"" DOIT博客1@8YqS5[3A(La4o
myResult = SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))
3、使用VBSQL对DB库API编程 Global giHDB As Long DOIT博客'lO:N1B iT
Global giHStmt As Long
$} }Y^Vz0 DOIT博客C"a.o!S'g8XvR
Dim myResult As integer DOIT博客9S@aJVO
Dim myConnection As Srting
D+H:`%p|6YIW0 Dim myBuff As String*256
|(ej1fC9T0 Dim myBufflen As Integer
:_Pr5w`*@%y?7Y0
/k8C%l"z+Y3F+X.w K0 If SQLAllocEnv(giHEnv)<>SQL_SUCCESS Then
O`e:GFk5t'O)Q?m6f0 MsgBox"Allocation couldn注释:t happen!"
-E/S(F4B"K]S0 End If DOIT博客3[4A,b-PN Fi&eu_
If SQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then DOIT博客*w:K!t'p1Fy&e
MsgBox "SQL Server couldn注释:t connect!" DOIT博客 uRDN5|%YI
End If DOIT博客rlql6JL
myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
c9y{4i t*RD!a8s.]7A G(q0 myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),DOIT博客l6M"a-j'MCnG
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQU IE D)
5b+H?}v{y1vRw0 myResult=SQLAllocStmt(giHDS,giHStmt) DOIT博客-xg gV4l\'e
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
@Iu;WS0 rsSQL="Select * from Customers Where City = "Hunan"" DOIT博客1@8YqS5[3A(La4o
myResult = SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))
EoM%M7@X-ZuQ0
!FK6]z6V@2C0 DOIT博客L p.Q r5h
DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:
4D| ?EK B0 DOIT博客(g*FF_A1d}:W&h1W
VBSQL.VBX: 包含库函数,具有访问重要的消息和处理错误的能力
R9OD;G8b0 DOIT博客F3oAE+h4IV ?nzP
VBSQL.BI:包括所有的常量和变量说明 DOIT博客'o_5Q1L7Ilc
0Q UzF"[-[ c.x'}3j&}A0 VBSQL.HLP:Windows帮助文件,使用VBSQL的指南
&RIc]\T:\dxJi0 DOIT博客c'DBu9b
使用VBSQL时,必须将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBSQL.VBX文件。 DOIT博客!t\0Z/`6d)X
}%\i} Fm0 一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。DOIT博客 dv8tJ dbF
~ G-_X+ob0
CODE:
Private Sub InitializeApplication() DOIT博客'L
s?M(?)I.`h
DBLIB_VERSION=SqlInit()
YX7rs?Ge:pKpG0 If DBLIB_VERSION=""Then DOIT博客qh,R#rhn(J
MsgBox"Could not initialize DBLIB!Exit application.", MB_ICONEXCLAMATION DOIT博客:t*cie!G7g F-y
End If DOIT博客.M Q B^k4gC
End Sub
K3SE/Z0R-s9GKG3Ls0 Private Function LoginToServer() As integer
$m$qr [f#a[0 loginToServer=SUCCEED
m/A;X,`(ntJ p0 Status%=SqlSetloginTime%(loginTimeOut)
Tjq.Se"i%i;O?bZ0 If giSqlConn<>0 Then
P'V)g"Tq(v(Z0 SqlClose(giSqlConn) 注释:关闭已打开的连接
5Ib?#y {5l0 giSqlConn=SqlOpenConnection(gsServerName, gsLoginID, gsPassword, ProgramName, ProgramName)
k~;jZ.B&\M0 If giSqlConn<>0 Then DOIT博客k DG9?]
liresuit=SqlUse(giSqlConn,"Sales")
DBLIB_VERSION=SqlInit()
YX7rs?Ge:pKpG0 If DBLIB_VERSION=""Then DOIT博客qh,R#rhn(J
MsgBox"Could not initialize DBLIB!Exit application.", MB_ICONEXCLAMATION DOIT博客:t*cie!G7g F-y
End If DOIT博客.M Q B^k4gC
End Sub
K3SE/Z0R-s9GKG3Ls0 Private Function LoginToServer() As integer
$m$qr [f#a[0 loginToServer=SUCCEED
m/A;X,`(ntJ p0 Status%=SqlSetloginTime%(loginTimeOut)
Tjq.Se"i%i;O?bZ0 If giSqlConn<>0 Then
P'V)g"Tq(v(Z0 SqlClose(giSqlConn) 注释:关闭已打开的连接
5Ib?#y {5l0 giSqlConn=SqlOpenConnection(gsServerName, gsLoginID, gsPassword, ProgramName, ProgramName)
k~;jZ.B&\M0 If giSqlConn<>0 Then DOIT博客k DG9?]
liresuit=SqlUse(giSqlConn,"Sales")