分享

vb访问SQL Server 的几种常用方法

 加菲 2005-08-16
摘要
本文讨论了Visual Basic应用程序访问SQL Server数据的几中常用的方法,分别说明了每种方法的内部机理
并给出了每种方法的一个简单的实例,最后比较了每种方法的性能和优缺点。

               引言
Microsoft Visual Basic(简称VB)作为一种面向对象的可视化编程工具,具有简单易学的,灵活方便和易于
扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集。因此它越来越多地用作大型公
司数据和客户机—服务器应用程序的前端。与后端的
Microsoft SQL Server相结合,VB能够提供一个鲁棒的、高性能的客户机—服务器方案。
使用Visual Basic作为前端开发语言,与SQL Server接口有三种常用的方法,即:
   *数据访问对象/Jet
   *为ODBC API编程
   *使用SQL Server的Visual Basic库(VBSQL)为DB库API编程
本文将讨论这三种VB应用程序管理SQL Server数据的方法,并比较每种方法的性能和优缺点。

方法1.数据访问对象/Jet
Visual Basic支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器
之间的对话方式,但它确有许多优点。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,
Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通地调用驱动
器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs
访问SQL Server的VB实例。
‘form Declarations
Dim mydb As Database
Dim mydynaset As Dynaset

Private Sub form_Load()
   Set mydb=OpenDatabase("",Fa|se,Fa|se,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es")
   Set mydynaset=mydb CreateDynaset("Select*from Customers")
End Sub
上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数
的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。
其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。

方法2.用ODBC API编程
ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用
函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动
程序管理器反过来通过驱动器反过来通来驱动器(SQLSRVR.DLL)把它们送到服务器中。
用ODBC API编程,一般要用到以下一些函数。下面列出了常用的函数以及它们的功能。
   函数                  功能
   SQLALLocEnv         初始化ODBC环境,返回环境句柄
   SQLALLocConnect      为连接句柄分配内存并返回连接句柄
   SQLConnect         连接一个SQL数据资源
   SQLDriverConnect     连接一个SQL数据资源,允许驱动器向用户询问信息
   SQLALLocStmt          为语句句柄分配内存并返回语句句柄
   SQLExecDirect         把SQL语句送到服务器
   SQLFetchAdvances     到结果集的下一行(或第一行)
   SQLGetData          从结果集的特定的一列取回数据
   SQLFreeStmt          释放与语句句柄相关的资源
   SQLDisconnect          切断连接
   SQLFreeConnect      释放与连接句柄相关的资源
   SQLFreeEnv          释放与环境句柄相关的资源
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了
语句句柄。
G|oba| giHEnv As Long
G|oba| giHDB As Long
G|oba| giHStmt As Long
Dim myResult As integer
Dim myConnection As Srting
Dim myBuff As String*256
Dim myBufflen As Integer
If SQLA||ocEnv(giHEnv)<>SQL_SUCCESS Then
   MsgBox"A||ocation couldn‘t happen!"
End if
if SQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then
   MsgBox "SQL Server couldn‘t connect!"
End if
myConnection="DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales"
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=SQLA||ocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="Select*from Customers Where City="Wuhan""
myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))

方法3.使用VBSQL对DB库API编程
DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。
从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下
三个文件:
   VBSQL.VBX 包含库函数,具有访问重要的消息和处理错误的能力
   VBSQL.BI 包括所有的常量和变量说明
   VBSQL.HLP Windows帮助文件,使用VBSQL的指南
使用VBSQL时,必需将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBSQL.VBX文件。
一个典型的VBSQL对话中,一般要用到以下这些函数。
   函数                  功能
   Sq||nit          在客户机上装载DB库
   Sq|OpenConnection      打开服务器连接,返回连接句柄
   Sq|Cmd          在客户机上建立批处理命令
   Sq|Exec          向服务器提交批处理命令
   Sq|rexu|ts          把客户机定位在第一条(或下一条)结果集的开端
   Sq|NextRow          驱动每个结果集的行之间的循环
   Sq|Data          访问一个特定列的数据
   Sq|C|ose          切断特定的连接
   Sq|Exit          切断所有找开的连接
   Sq|WinExit         卸下DB库
一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用SqlConnection打开
一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。
Private Sub |nitia|izeApp|ication()
   DBL|B-VERS|ON●=Sq||nit●()
   |f DBL|B_VERS|ON●=""Then
       MsgBox"Could not initia|ize DBL|B!Exit app|ication.",MB_|CONEXCLAMAT|ON
       End
   End if
End Sub
Private Function LoginToServer() As integer
   loginToServer=SUCCEED
   Status%=Sq|SetloginTime%(loginTimeOut)
   |f giSq|Conn<>0 Then
       Sq|C|ose(giSq|Conn) ‘关闭已打开的连接
giSq|Conn=Sq|OpenConnection(gsServerName,gsLogin|D,gsPassword,ProgramName●,ProgramName●)
   |f giSq|Conn<>o Then
       |iresu|t=Sq|Use(giSq|Conn,"Sales")
   Else
       LogintoServer=FA|L
   End |f
End Function

性能比较
以上三种访问SQL Server的方法各有各的特点。DAOs方法是基于对象的,因而便于使用,但是它从Visual Basic
到SQL Server的最慢的方式。ODBC API和VBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的
互操作性,编程简单,但速度慢于VBSQL方法。VBSQL方法通过VBSQL控件,提供了重要的SQL Server前端应用程序所
需的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计算列等。
这些都是VBSQL方法超出其它方法的优势,但其编程稍复杂。至于实际使用哪一种接口方式,在很大程度上依赖于用
户的应用程序的具体情况而定。  

                                     王生 推荐

二.锁住计算机直到输入正确的密码。              作者:juhalepola

‘这是一个十五岁的芬兰少年提供的程序(He is from Finland.).

Option Explicit
Dim ter As Boolean

Private Sub Command1_Click()
ter = False
DisableCtrlAltDelete (False)
Unload form1
End Sub


Private Sub form_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Timer1.Enabled = False
Timer2.Enabled = True
Text1.Enabled = True
End If
End Sub

Private Sub form_Load()
DisableCtrlAltDelete (True)
ter = True
End Sub


Private Sub form_LostFocus()
form1.SetFocus
End Sub


Private Sub form_Unload(Cancel As Integer)
If ter = True Then
Cancel = 5
Else
End If
End Sub


Private Sub Timer1_Timer()
form1.SetFocus
Label2.Caption = 5
End Sub


Private Sub Timer2_Timer()
Label2.Caption = Val(Label2.Caption) - 1 & " Seconds time to write a password."
Text1.SetFocus
If Text1.Text = "mouse" Then
ter = False
Timer2.Enabled = False
Timer1.Enabled = False
Label2.Caption = "5"
MsgBox "Password accepted, you can close this programm now."
Text1.Enabled = False
Command1.Enabled = True
End If
If Val(Label2.Caption) = 0 Then
Timer1.Enabled = True
Timer2.Enabled = False
Text1.Text = ""
Text1.Enabled = False
Command1.Enabled = False
End If
End Sub

‘ MyModule has the following functions/subs
‘ Subs:
‘ OpenApp(FileName as string)
‘ * Opens an application with the filename specified
‘ * Use: OpenApp(FileName)
‘ DisableCtrlAltDelete(bDisabled As Boolean)
‘ * Disables Control Alt Delete Breaking as well as Ctrl-Escape
‘ * Use: Call DisableCtrlAltDelete(Boolean)
‘ Center(formName as form)
‘ * Centers the specified form
‘ * Use: Center(formName)
‘ AlwaysOnTop(formName as form, bOnTop as boolean)
‘ * Sets the named form as always on top
‘ * Use: Call AlwaysOnTop(True)
‘ ExitWindows(Mode)
‘ * Shutdown or reboots windows
‘ * Use: ExitWindows(shutdown)
‘ * ExitWindows(reboot)


‘ Used for DisableCtrlAltDelete
Private Declare Function SystemParametersInfo Lib _
"user32" Alias "SystemParametersInfoA" (ByVal uAction _
As Long, ByVal uParam As Long, ByVal lpvParam As Any, _
ByVal fuWinIni As Long) As Long
‘-------------------------------------------

‘ Used for ExitWindows
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Private Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved _
As Long) As Long
‘ ---------------------

‘ Used for AlwaysOnTop
Const FLAGS = 3
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Public SetTop As Boolean
Private Declare Function SetWindowPos Lib "user32" (ByVal h%, ByVal hb%, ByVal X%, ByVal Y%, ByVal cx%, ByVal cy%, ByVal f%) As Integer
‘-------------------------------------------

Sub ExitWindows(ExitMode As String)
Select Case ExitMode
Case Is = "shutdown"
t& = ExitWindowsEx(EWX_SHUTDOWN, 0)
Case Is = "reboot"
t& = ExitWindowsEx(EWX_REBOOT Or EXW_FORCE, 0)
Case Else
MsgBox ("Error in ExitWindows call")
End Select

End Sub
Sub AlwaysOnTop(formName As form, bOnTop As Boolean)
‘Sets a form as always on top
Dim Success As Integer
If bOnTop = False Then
Success% = SetWindowPos(formName.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
Else
Success% = SetWindowPos(formName.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
End If
End Sub




Sub Center(formName As form)
‘ Center forms...
‘Move (Screen.Width - formName.Width) \ 2, (Screen.Height - formName.Height) \ 2
End Sub
Sub DisableCtrlAltDelete(bDisabled As Boolean)
‘ Disables Control Alt Delete Breaking as well as Ctrl-Escape
Dim X As Long
X = SystemParametersInfo(97, bDisabled, CStr(1), 0)

End Sub

Sub OpenApp(File As String)
‘Shells to another application
X = Shell(File)
End Sub
                                             返回

三. VB应用程序编制实例
 
VB自问世以来,已从1.0版步入到功能十分强大的5.0版。VB以其开发软件周期短、操作简单、可视化程度高的优点倍受编程人员的青睐。近几年来,许多Windows程序员应用VB作为编程语言,开发了大量的应用软件。本文通过几个实例说明了VB的强大功能。

(一)、工具棒的建立方法

Windows应用程序的操作界面都含有大量的图标,这些图标集中放在某一个区域形成工具棒(Toolbars), 工具棒中的图标用图示的方法表示某一种功能,可以加速操作,在某些Windows应用程序中还把这些工具棒直接称为加速棒(Speedbars)。下面介绍编制工具棒的方法。

在窗体上画一个足够大的图片框,使用这个图片框可以存放图标。设置图片框的Align属性,使图片框列在窗口的顶部,即[窗体名][控件名]Align=1

在图片框中增加影像控件(Image Control)数组或者三维命令控制按钮数组(3D Command Button Control)。改变控件的Picture属性,输入图形,图形的格式为:*.BMP,*.DIB,*.WMF,*.ICO。

下面的实例介绍了工具棒的建立方法,具体步骤为:

1.建立一个图片框,取名为Demo(即Name属性为Demo),设置Align属性,即 Demo.Align=1

2.在图片框上增加三维命令按钮,设置Name属性为Tool,设置Index的属性为0(第一个控件),改变 Picture 属性,输入图示化的图形(文件)。改变提示信息,设置Caption取值为空。

3.增加三维命令按钮控件,设置Name属性为Tool,注意使Index属性分别为1,2,……。

4.建立窗体Paint事件过程

Sub formPaint()

Demo.ScaleHeight = Tool(0).Height ‘设置工具棒的高度

iw% = Tool(0).Width ‘获取第一个图标的宽度,用于设置其他的图标宽度

For i% = 0 To 3

Tool(i%).Height = Demo.Scaleheiht

Tool(i%).Width = iw%

Tool(i%).AutoSize = 1 ‘设置图标中的图形充满整个图形框

Tool(i%).Move iw% * i%, 0 ‘重新排列所有图标的位置

Next i%

End Sub

5.建立图标事件过程

为工具棒中的每一个图标增加一个过程,执行相应的命令:

Sub Tool_Click(index As Integer)

If index = 0 Then

Tool (0). Picture = Load(″animal.bmp″) ‘更换第一个图标中图像

ElseIf index = 1 Then

j% = Shell(″calc.exe″, 1) ‘执行WINDOWS95计算重新CALC.EXE

ElseIf index = 2 Then

End ‘中止程序的执行

End If

End Sub

在实际应用中,程序员可以发挥自己的想象力,从而完善工具棒的功能。

(二)、Windows演示程序的编程方法

Windows应用软件系统中教学演示程序,在整个系统中占有十分重要的地位,它从一个侧面反映了应用软件的功能和用户界面。下面介绍了使用VB编制演示软件的语言基础,并列举实例说明。

(三)、演示软件激活语言软件的方法

应用软件可以通过演示程序激活,无论该应用程序是否是用户自己编制的程序。例如,用户可以通过演示激活字处理软件Word for Windows。应用软件的激活可以依照应用软件所处状态使用Shell函数或AppActivate命令激活。

1.Shell函数的使用

Shell函数可以运行一个执行程序(即应用程序),类似在“文件管理器”的“文件”菜单中运行一个程序,Shell函数的使用语法是:

Shell(commandstr$,winstyle%)

其中,commandstr$是一个包含有路径的可执行文件字符串,winstyle%是决定运行窗口类型的参数。例如

j%=Shell(″c:\win\write.exe″,1)

该句启动Windows中“Write”应用软件,窗口类型为具有输入焦点的正常窗口,它的返回值在VB中不使用。

2.AppActivate命令的使用

AppActivate命令可以把Windows的焦点移向指定的应用程序,若该应用程序没有启动,AppActivate也不能启动,且此时会出现运行错误,使用AppActivate的语法是:

AppActivate titletext$

titletext$是应用出现的标题(窗口顶部的第一行文字),对大小写不敏感。例如:

AppActivate“calculator”or AppActivate“CALCULATOR”

这两句都能够把Windows的焦点移向“计算器(Calculator)”,即把计算器从后台调入前台。对于中文版Windows应使用下面的命令:

AppActivate“计算器”

3.模拟输入控制应用程序

演示程序的关键是能使用代码模拟手工输入,控制应用程序的运行过程。使用Sendkey命令可以模拟键盘输入,使用方法为:

Senekey keyin$,Wait%

其中, keyin$为模拟输入的控制字符串。Wait%为真(非零)时,说明其它程序运行模拟输入完毕后,VB才继续运行;Wait%为假时,说明VB命令一执行( Send Keys),马上继续运行自己本身。Wait%可省略,缺省值为0。下面为两实例:

SendKeys“%{F4}”,1

该句说明向应用程序输入<ALT>+<F4>,相当于通过键盘键入了退出应用程序的操作。

SendKeys“(Hello){Enter}”,1

相当于通过键盘键入“Hello”,然后按回车键换行。
                                          sleet 推荐

四.VB中APP对象及其应用   作者   韩潮涌 (四川)

初学VB编程,很快就能编出些实用的程序了。我便将它们制成安装盘送给朋友,但很快就发现一个问题,程序总是按编程时固定好的路径读写文件,但文件路径改变,程序就找不到路径了,因此不能正常写文件。例如编程时设定:picture1.picture=Load Picture("c:\HVB\HAN.BMP")但若安装使用时,工作目录变为E:\HVB\HAN.BMP或其它路径,程序就会出错,并提示:找不到文件路径。这个问题看起来很复杂,但实际上很好解决,这只需用VB的App对象。
App对象有两种重要属性:(1)App.Path,它在VB编程状态下返回你的.MAK文件所在目录;在以.EXE文件运行时,则返回你的.EXE文件所在目录。(2)App.EXE Name它返回你的程序名。下面举一个简单的例子,假如你有一个程序为DDC,其目录为C:\HVB\DDC4(包括DDC.EXE)在VB编程环境下,在Debug窗口运行:Print App.Path,显示结果:C:HVB\DDC4,再运行Print App.EXEName显示结果:DDC。知道了以上两种属性,前面所述问题就很好解决了,可以将其修改为:Dim Apath ,Dim FilePath
Apath=App.Path
FilePath=Apath+"\HAN.BMP"
Picture1.Picture=LoadPicture(FilePath)
这样,这程序的工作目录无论改为什么,都能正常工作了。
(注:文件目录为根目录时,以上情况略有不同,App对象在VB2.0以上版本中均存在。)
   点评:推荐给大家的也是软件实用化的一个小小改进。本文所讨论的问题可能对于有数据库操作的软件尤具实际意义,看了本文你是否可以不必再为你的软件指定固定的目录了呢?


五.VB中实现窗口自由分割   作者:许振华
    大家可能注意到,目前Windows下的应用软件许多都具有窗口自由分割的功能,本文给出在VB中实现的方法。
  要实现窗口自由分割功能,需要用一个图片框(Picture box)作为分割条,在程序运行时,将其放在两个窗口之间,两个窗口自动调整大小紧靠图片框。当用户拉动分割条时,窗口自动调整大小,一直紧靠分割条,这样似乎是一个窗口被分割条分开。下面是一个例子。
  在窗体中放入两个列表框,一个图片框,名字分别为list1、list2、pic1,对pic1的属性设定如下:将mousepointer属性设定为99(用户自定义),将mouseicon设定为中间带分割线的双箭头鼠标形式,具体做法是单击mouseicon后的(无),将会出现三个点,单击这三个点将会打开文件对话框,一般来说,鼠标样式文件放在vb5\graphics\cursors文件夹中,找到Ve-sizeb,选中它即可。这是当用户将鼠标移到分割条上或拉动分割条时鼠标的形状。窗体中这三个控件的位置可随意放,因为在程序运行时自动设定它们的位置和大小。然后写如下代码:

  Option Explicit

  Private Const P_ECART=3

  Private y1 As Integer

  Private y2 As Integer

  Private x1 As Integer

  Private x2 As Integer

  Private width1 As Integer

  Private width2 As Integer

  Private height1 As Integer

  Private height2 As Integer

  Private glbfrmInSizeX As Long

  Private Sub pic1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

  If glbfrmInSizeX <> &H7FFFFFFF Then

  If CLng(x) <> glbfrmInSizeX Then

  pic1.Move pic1.Left+x, y1,P_ECART,ScaleHeight-2

  glbfrmInSizeX = CLng(x)

  End If

  End If

  End Sub

  Private Sub pic1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

  If glbfrmInSizeX <> &H7FFFFFFF Then

  If CLng(x) <> glbfrmInSizeX Then

  pic1.Move pic1.Left+x,y1,P_ECART, ScaleHeight-2

  End If

  glbfrmInSizeX = &H7FFFFFFF

  pic1.BackColor = &H8000000F

  If pic1.Left > 60 And pic1.Left < (ScaleWidth - 60) Then

  list1.Width=pic1.Left-list1.Left

  ElseIf pic1.Left < 60 Then

  list1.Width=60

  Else

  list1.Width=ScaleWidth-60

  End If

  form_Resize

  End If

  End Sub

  Private Sub pic1_MouseDown(Button As Integer, Shift As Integer, x As Single,y As Single)

  If Button=vbLeftButton Then

  pic1.BackColor=&H808080

  glbfrmInSizeX=CLng(x)

  Else

  If glbfrmInSizeX <>&H7FFFFFFF Then

  pic1_MouseUp Button,Shift,x,y

  End If

  glbfrmInSizeX=&H7FFFFFFF

  End If

  End Sub

  Private Sub form_Resize()

  Const B_ECART=1

  On Error Resume Next

  y1=B_ECART

  height1=ScaleHeight-B_ECART*2

  x1=B_ECART

  width1=list1.Width

  x2=x1+list1.Width+P_ECART-1

  width2=ScaleWidth-x2-B_ECART

  list1.Move x1-1, y1, width1, height1

  list2.Move x2,y1,width2+1,height1

  pic1.Move x1+list1.Width-1, y1,P_ECART, height1

  End Sub

  Private Sub form_Load()

  glbfrmInSizeX=&H7FFFFFFF

  form_Resize

  End Sub

  程序运行环境:VB 5.0中文版、中文WIN9X,VB 4.0/5.0/6.0 。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多