您的位置:寻梦网首页编程乐园VB 编程乐园VB 技巧库
Visual Basic 技巧库
第 7 部分 (61-70)
(1-10) (11-20) (21-30) (31-40) (41-50) (51-60) (61-70) (71-80) (81-90) (91-100) (101-110) (111-120) (121-131)
(61) 开始屏幕保护
(62) 开始上次关机时关闭的应用
(63) 快速建立目录
(64) 理解与掌握ACCESS
(65) 利用集合过滤重复的值
(66) 列出 SQL Server 数据库中所有的存储过程
(67) 目录所占的字节数
(68) 判断驱动器类型
(69) 判断是否已经建立 Dial Up 连接
(70) 判断是否在 VB5 环境下运行


开始屏幕保护
使用 API 开始屏幕保护 98-8-22
声明:
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg _
As Long, ByVal wParam As Long, ByVal lParam As Long) _
As Long
Const WM_SYSCOMMAND = &H112&
Const SC_SCREENSAVE = &HF140&
代码:
Dim result As Long
result = SendMessage(Form1.hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0&)




开始上次关机时关闭的应用
自动开始上次关机时关闭的应用 98-8-03
两点关键:
1 检测是 Windows 关闭引起的 QueryUnload   事件。
2 改写 Software\Microsoft\Windows\CurrentVersion\RunOnce


声明:
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.


在主 Form 中增加:


Public Const REG_SZ = 1
Public Const HKEY_CURRENT_USER = &H80000001


Private Sub Form_QueryUnload (Cancel as Integer, UnloadMode as Integer)
Dim hKey As Long
Dim strRunCmd As String
If UnloadMode = vbAppWindows Then
 strRunCmd = App.Path & "\" & App.EXEName & ".EXE"
 Call RegCreateKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\RunOnce", hKey)
 Call RegSetValueEx(hKey, "MyApp", 0&, REG_SZ, ByVal strRunCmd, Len(strRunCmd)+1)
 Call RegCloseKey(hKey)
Endif
End Sub




快速建立目录
快速建立目录 98-8-22
声明:
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function CreateDirectory Lib "kernel32" _
Alias "CreateDirectoryA" (ByVal lpPathName As String, _
lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
函数:
'Call CreateNewDirectory("c:\test\directory\vb\tips\")
Public Sub CreateNewDirectory(NewDirectory As String)
Dim sDirTest As String
Dim SecAttrib As SECURITY_ATTRIBUTES
Dim bSuccess As Boolean
Dim sPath As String
Dim iCounter As Integer
Dim sTempDir As String
iFlag = 0
sPath = NewDirectory
If Right(sPath, Len(sPath)) <> "\" Then
sPath = sPath & "\"
End If
iCounter = 1
Do Until InStr(iCounter, sPath, "\") = 0
iCounter = InStr(iCounter, sPath, "\")
sTempDir = Left(sPath, iCounter)
sDirTest = Dir(sTempDir)
iCounter = iCounter + 1
'create directory
SecAttrib.lpSecurityDescriptor = &O0
SecAttrib.bInheritHandle = False
SecAttrib.nLength = Len(SecAttrib)
bSuccess = CreateDirectory(sTempDir, SecAttrib)
Loop
End Sub



理解与掌握ACCESS
              用xBase 用户的眼光理解与掌握ACCESS


          中国矿业大学工商管理学院(221008)----王建军


---- 摘要:本文从xBase 用户的角度对比分析
了ACCESS 与xBase 的差异并进一步阐述了ACCESS 中的
数据库对象及编程方法。


---- 关键词:ACCESS----Foxpro----数据库


---- 微软公司有两个流行的桌面数据库开发工
具,一个是其自行研制开发的基于WINDOWS 环境
的ACCESS,另一个是其兼并FOX 公司而得到的Foxpro
。通常将dBASE、foxBase、Foxpro 等统称为xBase 在我国
拥有大量的用户,随着微软公司的ACCESS 在国际
桌面数据库市场上的迅速崛起及中文OFFICE 在我
国的深入普及,越来越多的用户开始使用MS
ACCESS(中文OFFICE97 的组件之一),很多xBase 用户
也开始转向或使用微软公司的ACCESS。由于ACCESS
的文件组织、数据类型、编程语言、编程方法等
与xBase 有较大的差异,致使不少xBase 用户在学
习ACCESS 时感到困惑,有些用户甚至仅仅是因为
从ACCESS 中找不到与xBase 相对应的命令而对ACCESS
大加抨击,从而放弃ACCESS 的学习。与xBase 相比,
ACCESS 有很多先进特性,xBase 用户一旦你掌
握ACCESS 的基本概念与编程方法、改变“xBase 的思
维方式”,就能利用已有的xBase 知识能够很快地
掌握ACCESS。本文从多方面对xBase 和ACCESS 进行对比
分析,通过对比使传统的xBASE 用户更好地理解与
掌握ACCESS。


---- 壹、ACCESS 与xBase 的主要差异:


---- 从大的方面说,ACCESS 的使用与编程方法
同Visual Foxpro3.0 及Visual Foxpro5.0 的使用与编程方
法非常相似,熟悉Visual Foxpro3.0 及以上版本的用
户会非常容易地学会ACCESS。没有使用过Visual
Foxpro 的传统xBase 用户在开始学习ACCESS 或Visual
Foxpro 时,需要从思想上做较大的转变,这是由
于ACCESS 及Visual Foxpro 都是采用基于事件处理和面
向对象的程序设计方法。下文中所谈到的xBase 指
的是Visual Foxpro 以下的版本。


---- 文件组织不同:用xBase 建立的系统通常包含
很多不同类型的文件,每一个表、程序、报表、
查询、索引、菜单等内容都是文件的方式存放在
磁盘上,可以通过项目文件对其他类型的文件
进行组织与管理;ACCESS 对数据库的组织同大型
后台数据库系统(如SQL SERVER)的数据库组织非
常相似,不同数据或程序元素称为对象,所有的
对象都存储在一个物理文件中,而这个物理文
件被称为数据库。


---- 编程语言不同:在传统的xBase 中,表、记录等
数据操纵或是界面的设计采用的是xBase 命令进
行编程,高版本的Foxpro 中引入了部分SQL 语句(如
SQL-SELECT)主要用来完成数据的查询;ACCESS 中对
表、记录等数据操作主要通过SQL 实现,程序及事
件代码的编写采用Visual Basic for Application(低版
本的ACCESS 用access basic 编程),简单的程序设计用
宏。Visual Basic 是更为通用的编程语言,MS Office 的
组件都可以用Visual Basic 进行编程。


---- 编程方法不同:xBase 中采用面向过程的程序
设计方法,即使是一个用户输入界面的设计也
需要较长的一段xBase 程序;ACCESS 中采用面向对象
的程序设计方法,数据处理功能的完成通过改
变对象的属性或执行对象方法实现,程序段通
常构成事件过程、对象方法、函数,ACCESS 中较少
会出现连续的长程序。此外,ACCESS 中具有字段
级、记录级、表级数据引用完整性数据约束功
能,事务处理功能和完备的安全机制。


---- 贰、ACCESS 中的数据库对象


---- ACCESS 的数据库窗口中包含六类不同的数据
库对象,它们分别是表(Table)、查询(Query)、窗体
(Form)、报表(Report)、宏(Macro) 和模块(Module)。ACCESS
的数据库如同一个容器一样包含了全部的数据
库对象,与Foxpro 的项目文件不同ACCESS 将这些对
象存储在一个文件中。创建数据库对象只需单
击数据库窗口中的‘新建’按钮,修改已有对象
选择对象然后单击‘设计’按钮。


---- ACCESS 中的表:ACCESS 中的表等同于xBase 中的DBF
文件或Visual Foxpro 中的数据库表。ACCESS 的表
与xBase 的DBF 文件比有如下新特点:


    字段名可多达64 位字符
    可以设置字段的输入掩码、缺省值、值范
    围。相当与xBase 中使用@匞ET 语句中的PICTURE、
    DEFAULT、RANGE 等子句的作用。
    可以设置字段与字段间的关系(通过设置表
    的属性)


---- 在ACCESS 中,不需要用专门的命令或操作来建
立和维护索引文件,按某字段建立索引只需在
该字段的索引属性中选择特定的索引类型即
可,索引的建立维护和使用都是通过ACCESS 系统
来完成的,在xBase 中诸如:Index on、set index to 等操
作不必有用户关心。


---- 根据需要可在ACCESS 的数据库中创建多个表,
表与表之间能够建立所谓的参照完整性关系,
如同在xBase 中用set relation 、set skip 命令创建的多
对一和一对多关系一样,ACCESS 只需图形界面操
作就可完成一对多和多对一关系的建立并且通
过连锁删除与连锁更新来确保相关表中记录之
间关系的有效性,并且不能意外地删除或更改
相关数据。


---- 使用ACCESS 表与使用xBase 的DBF 文件的一个重要
差别是所谓“打开”的概念不同,xBase 中用USE 命
令打开DBF 文件实质是在内存建立数据缓冲区提
供数据通道,若想查看DBF 文件中的数据需要再
使用BROWSE 或其他命令,ACCESS 中打开一个表相当
于xBase 中USE + BEOWSE 命令。对表中的数据进行处理
而不显示表中的记录,在ACCESS 中通常有两中做
法,一种是用SQL 语句更新或改变数据,无须先打
开表后执行SQL 语句;另一种是用VBA 编程通过数
据访问对象(DAO)来操纵表,通过DAO 操纵表时,
要打开所谓的记录集(Recordset),xBase 中的USE 命
令与VBA(Visual BASIC for Application)中的Openrecordset
方法的作用象类似。


---- 查询(Query):ACCESS 中的查询本质上就是SQL 的
数据操纵语句,利用查询可以通过不同的方法
来查看、更改以及分析数据,相当于Foxpro 中的SQL
SELECT 语句及Foxpro 的查询。在ACCESS 中,对表、记
录、字段的多数操作都可通过查询来完成,例
如:在xBase 中使用很多的REPLACE ... WITH ... 命令
在ACCESS 中应当用一个动作查询来完成(SQL UPDATE
)。在ACCESS 中建立和使用查询基本上等同于在
后台数据库(如:ORACLE、SQL SERVER)中使用SQL 命
令,Microsoft Jet 数据库引擎的SQL 符合ANSI SQL,ACCESS
的SQL 实现了几乎所有的ANSI SQL 功能,有些SQL 命令
在ANSI SQL 中所没有的。


---- ACCESS 中选择查询比Foxpro 中的SQL SELECT 命令使
用起来更为方便灵活,在ACCESS 中,选择查询在使
用等同于表,可以在表与查询间建立关系,查询
也可象表一样作为窗体和报表的记录来源,利
用查询还能再建查询。


---- 窗体(Form):窗体是利用ACCESS 开发出系统的
主要交互界面,在有些书刊上又把窗体叫做表
单,窗体相当于xBase 中利用@匰AY匞ET 命令编写用于
实现所谓全屏幕编辑功能的程序,窗体又近似
于Foxpro 中的屏幕文件(.SCX)。在ACCESS 中建立人机
交互界面如同在Foxpro 中建立屏幕文件需要创建
窗体对象。


---- 报表(Report):ACCESS 的报表对象最接近xBase 中
的报表文件(FRX、FRM)。在xBase 中建立报表文件之
后需要用REPORT FORM ... 命令预览或打印报表,
ACCESS 中报表对象建立之后可直接在数据库窗口
中单击‘打开’按钮预览报表或是在宏或模块中
用OPENREPORT 命令打印或预览报表。


---- 宏(Macro):宏是指一个或多个操作的集合,
其中每个操作实现特定的功能,例如打开某个
窗体或打印某个报表。宏可以使某些普通的任
务自动完成。例如,可设置某个宏,在用户单击
某个命令按钮时运行该宏,以打印某个报表。在
xBase 中没有特定的文件类型与ACCESS 的宏相对
应,在ACCESS97 及以下的版本中,利用宏来创建用
户自定义菜单。


---- 模块(module):ACCESS 的模块相当于xBase 中的程
序文件和过程文件。每一个模块中可以包含一
个或多个子程序、函数或属性,子程序相当于
xBase 中的过程(Procedure)。


---- 壹、ACCESS 中用户界面设计


---- 在信息系统的开发中,用户界面的设计占有
较大的工作量。ACCESS 中的用户界面设计比xBase 中
的用户界面设计大大简化,早期的xBase 版本中用
户界面的设计需要确定屏幕上显示文字的坐标
位置然后用户@ 卻ay単et 命令书写程序;Foxpro 中,
用户界面的设计有了较大的改进,设计用户界
面时,先建立屏幕文件(.SCX),然后用生成器生
成用户界面的程序文件(.SPR)。ACCESS 中建立用户
界面即建立数据库窗体对象(Form),Form 的建立
与设计和多数基于WINDOWS 的开发工具(如:Visual
BASIC)的界面设计一致,与xBase 的用户界面设计
有较大的差异,xBase 用户应从以下几个方面理解
和把握ACCESS 的窗体设计:


---- 1. 理解窗体与程序


---- Foxpro 中,建立用户交互界面需先建立屏幕
文件,屏幕文件中又包含若干代码片段(Code
Snippet),利用生成器根据屏幕文件生成扩展名
为SPR 的程序文件,代码片段被包含在程序文件
之中,执行程序文件即出现交互式用户界面。
ACCESS 中,窗体相当于屏幕文件,窗体有三种不
同的视图(VIEW)-- 设计视图、窗体视图和数据表
视图。设计视图模式用于设计或修改窗体,窗体
设计好之后就可以以窗体视图或数据表视图打
开窗体即为用户操作使用的交互界面。ACCESS 中
不需要将窗体生成程序代码,窗体建好之后直
接打开窗体或切换到窗体视图即可。Foxpro 中另
人头疼的事情之一是调试屏幕时反复修改屏
幕、生成程序代码、执行程序观看运行效果,对
屏幕文件的任何微小改动都必须通过生成程
序、执行程序才能看到结果,ACCESS 中无须生成过
程,只需在设计视图与窗体视图间切换即可知
道窗体修改后的效果。


---- 窗体模块与事件过程:在Foxpro 中,@匞ET 、READ
、ACTIVATE 等命令中都可带有许多子句,如:最为
常用的VALID 子句,子句通常跟一个用户自定义函
数,在用屏幕生成器建立屏幕文件时,子句后的
自定义函数的内容可直接输入,这些子句用到
的自定义函数程序段被称为代码片段(Code
Snippet)。ACCESS 中,与Foxpro 中代码片段相对应的
程序段是事件过程(Event Procedure),所谓事件过
程是指一种自动执行的过程,用来对用户或程
序代码启动的事件或系统触发的事件作出响
应。例如:在Foxpro 中若想在某一字段的值输入或
修改之后执行某一段程序,则需要通过输入代
码片段建立VALID 子句及VALID 子句所需要的自定义
函数;在ACCESS 中,某控件(CONTROL)的值在输入或
修改之后欲执行某段程序需在该控件的After
Update 事件属性的事件过程中输入程序内容即
可,当控件的值发生变化之后发生After Update 事
件系统就自动执行该事件对应的事件过程。
ACCESS 中每一个窗体都有与该窗体相关联的窗体
模块,窗体模块中存放了所有该窗体的事件过
程和该窗体的公用子程序和函数,窗体保存时
该窗体模块自动保存。


---- 2. 理解记录来源(Record Source)


---- 在Foxpro 中,创建屏幕文件之前应先打开相关
的表,建立表与表之间的关系,屏幕文件建立之
后在保存时系统会询问是否保存环境(Environment
),若保存环境则系统保存了打开的表,生成程
序代码中包含有打开和关闭表的命令。ACCESS 中
窗体的“数据环境”被称为记录来源(Record Source
),记录源可以是表、查询或SQL 的SELECT 语句。
ACCESS 的记录来源比Foxpro 的“数据环境”提供了
更大的灵活性,当ACCESS 窗体的记录来源是相互
?关联”的若干表时,ACCESS 中通过建立查询或是
使用SQL SELECT 语句作为记录来源,而查询与SELECT
语句指定了相关的表及表间关系。


---- 建立Foxpro 的屏幕文件需先打开相关表并保
存“数据环境”才能在生成程序时包含有打开表
的代码行,ACCESS 窗体的记录来源只是在窗体的
记录来源属性中给出表、查询名字或SQL SELECT 语
句,记录来源并不生成程序代码。窗体在打开时
自动处理表、查询及SELECT 语句的数据,并没有什
么命令或语句来处理表、查询的打开问题。


---- 3. 理解控件、属性及事件过程


---- Foxpro 屏幕生成器界面中添加的文本框
(TextBox)、列表框(ListBox)等项目在生成程序后
对应内存变量或字段变量,屏幕生成器中对文
本框等项目的许多设置形成了生成代码的@ ..GET
语句的许多子句如:ENABLE 、DISABLE 、FONT、STYLE
、DEFAULT、MESSAGE、RANGE 、COLOR 等,屏幕生成器中输
入的代码片段(Code Snippet)形成了程序中的自定
义函数或过程和@単et 语句的VALID、WHEN 等子句。
ACCESS 中,相当Foxpro 于屏幕生成器中文本框等项
目的称之为控件(CONTROL)。Foxpro 中@単et 语句的子
句在ACCESS 中是通过控件的属性来实现的,例如:
Foxpro 中的@ .... Get text disable 语句,在ACCESS 中是
将text 控件的enabled 属性值设置为False( 否);Foxpro
中SHOW GET TEXT ENABLE 在ACCESS 中用赋值语
句Me!text.enabled=true 改变text 控件的属性。Foxpro 中
的代码片段在ACCESS 中是通过事件过程实现的,
例如:Foxpro 中@匞et text valid check() 语句中包含
有Valid 子句和check() 自定义函数,实现同样的功
能在ACCESS 中在text 控件的Before Update( 或After Update)
属性值选择‘[ 事件过程]’并输入相应的程序代
码。常见的Foxpro @匞ET 语句的子句与ACCESS 的控件
属性对应关系如下:


Foxpro 子句
ACCESS 控件属性
FUNCTION
Format 、Input Mask 属性
PICTURE
Format 、Input Mask 属性
FONT
Font color name size weight italic underline 等属性
STYLE
Font italic underline 等属性
DEFAULT
Default Value
ENABLED|DISABLE
Enabled
RANGE
Validation Rule、Validation Text
SIZE
Left 、top、height、width
VILID
Before Update、After Update
WHEN
On enter 、On Got focus



---- 1. 在窗体中“移动记录指针”


---- 通过foxpro 屏幕生成器创建的用户界面中常
常包含用于移动记录的按钮,通过单击按钮改
变屏幕或窗口中当前记录,foxpro 中实现该功能
的方法一般是在按钮变量的valid 子句的函数中
增加指针移动语句如:skip、goto 、locate 等。XBase
用户初次使用ACCESS 窗体时欲实现同等功能但往
往不知如何下手,ACCESS 中实现窗体中记录导航
可以通过以下三种方法:


    在窗体的左下角增加记录导航控制按钮
    (navigation button)
    使用Goto Record 宏或Find Record 宏
    使用数据访问对象(DAO)改变当前窗体的记
    录


---- 若只是在窗体中前后移动记录,不需要编写
程序,在窗体的设计视图将窗体的navigation button
值设置为true,则在窗体时就会出现导航按钮,
用户通过单击导航按钮前移、后移记录。若想将
记录移到特定的记录则必须通过用宏或VB 编程
实现,例如:单击窗体中的CMD 按钮下移三个记录
则在CMD 按钮的on click 事件过程中输入如下VB 语
句:


---- DoCmd.GoToRecord ,,,3


---- 下面的示例在当前窗体中使用记录集
及FindFirst 方法将记录定位到“姓名”字段值为
?张三”的记录:


Dim rst As Recordset
       Dim strSearchName As String
       Set rst = Me.RecordsetClone
       strSearchName = " 张三"
       rst.FindFirst " 姓名= " & strSearchName
               If rst.NoMatch Then
                       MsgBox " 没找到"
               Else
                       Me.Bookmark = rst.Bookmark
               End If
       rst.Close


---- 程序中Me.RecordsetClone 是由窗体的RecordSource
属性指定的基础查询或基表的一个副本,Bookmark
是记录集的书签,用来唯一标识窗体基表、基
础查询或SQL 语句中的特定记录。例子中FindFirst
方法先在窗体记录来源的记录集副本中定位记
录,然后再将窗体的记录的位置移动到相同的
位置。


---- 壹、xBase 中的常用命令在ACCESS 中如何实现


---- 许多xBase 用户初次使用ACCESS 时常常在ACCESS 中
查找与xBase 命令相当的语句、功能或实现方法,
下表给出了常用的xBase 命令所对应的ACCESS 宏命
令及VB 语句或实现方法:


XBase 命令
ACCESS 宏命令
ACCESS VBA 语句
ACCESS 操作
USE < 表>


OpenRecordset 方法
通常不需要,处理表记录时用
BROWSE/EDIT
OpenTable
Docmd.opentable
在数据库窗口直接打开表
INDEX ON



指定表字段的索引属性
SORT ON



通过工具栏的按钮或菜单上命令
REPLACE



使用SQL 语句
SUM AVER 等


Dsum() 等函数
使用SQL 语句
GOTO
GotoRecord
Move 方法
使用记录导航按钮
SKIP
GotoRecord
Move 方法
使用记录导航按钮
LOCATE


FindFirst 方法
通过工具条或菜单命令查找与过滤操作
TOTAL



使用SQL 语句


壹、ACCESS 中的数据类型


---- xBase 用户在初次使用ACCESS 时对ACCESS 表的字
段类型特别是数值型字段类型不适应。正是由
于对ACCESS 的数据类型缺乏足够的了解,使得很
多用户在开发过程中出现了一些问题。ACCESS
与xBase 表的字段类型及其对应关系见下表:


ACCESS 中表的字段类型
xBase 中库的字段类型
字符型(Text)
字符型(Character)
数值型( 短整型、长整型、单精度、双精度)
数值型(Numeric)
货币型(Currency)
数值型(Numeric)
备注型(Memo)
备注型(Memo)
日期时间型(date/Time)
日期型(Date)
逻辑型(Yes/No)
逻辑型(Logical)
OLE 对象型(OLE Object)
通用型(General)


---- XBase 用户初次使用ACCESS 时常遇到的问题之
一是ACCESS 表中的数值型字段类型问题,在xBase
的DBF 文件中定义数值型字段需给出字段类型、
宽度和小数位数,在记录的数值型字段存放数
据时,xBase 只保存规定的小数位数并自动处理四
舍五入问题,ACCESS 中表的数值型字段同xBase 的数
值型字段不同,在表中的字段存放数值型数据
需将字段设置为短整型、长整型、单精度、双精
度或货币型中的一种,在数值字段保存数据时
不能保存固定长度的小数位数,也不能自动处
理小数的四舍五入问题。尽管字段属性中有
DecimalPlaces 和Format,但这两个属性只是确定数据
的显示方式而不是保留特定的小数位数,用户
必须在保存数值数据时自行处理保留的小数位
数及四舍五入问题。


---- XBase 用户使用ACCESS 表时常遇到另一个问题
是字段的NULL 值问题,xBase 中,若字段没输入值,
则字符型字段为空格串、数值型字段为零值;
ACCESS 中,若字段没输入值则字段的值为NULL(空
值),NULL 是ACCESS 中的特殊常量表示没值,NULL 不
能赋予非Variant 变量。通过DAO 访问记录的字段
时,使用NZ()函数将NULL 转换为字符型空串或数
值型零值。



中国计算机世界出版服务公司版权所有



利用集合过滤重复的值
   Dim i As Long
   Dim RawData As String
   Dim DataValues As New Collection


   On Error Resume Next
   ' 忽略 error 457 - Duplicate key
   For i = LBound(arr) To UBound(arr)
       RawData = arr(i)
       DataValues.Add RawData, RawData
   Next
   On Error GoTo 0


   ' 放到 ListBox 中
   lstSortedData.Clear
   For Each DataValue In DataValues
       lstSortedData.AddItem DataValue
   Next




列出 SQL Server 数据库中所有的存储过程
列出 SQL Server 数据库中所有的存储过程
Dim cn As rdoConnection
Dim ps As rdoPreparedStatement
Dim rs As rdoResultset
Dim strConnect As String
Dim strSQL As String
'利用 DSNless 连接到 pubs 数据库
'改变参数以适合你自己的 SQL Server
strConnect = "Driver={SQL Server}; Server=myserver; " & "Database=pubs; Uid=sa; Pwd="
Set cn = rdoEnvironments(0).OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt, ReadOnly:=False, Connect:=strConnect)


strSQL = "Select so.name,sc.name,st.name,sc.length " & "FROM syscolumns sc,master..systypes st,sysobjects so " & "WHERE sc.id in (select id from sysobjects where type ='P')" & " AND so.type ='P' " & "AND sc.id = so.id " & "AND sc.type = st.type " & "AND sc.type <> 39"


Set ps = cn.CreatePreparedStatement("MyPs", strSQL)


Set rs = ps.OpenResultset(rdOpenStatic)


list1.AddItem "SP Name,Param Name,Data Type,Length"
While Not rs.EOF
list1.AddItem rs(0) & " , " & rs(1) & " , " & rs(2) & " , " & rs(3)
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing




目录所占的字节数
目录所占的字节数
该函数返回目录使用的字节数:


Function DirUsedBytes(ByVal dirName As String) As Long
Dim FileName As String
Dim FileSize As Currency
If Right$(dirName, 1) <> "\" Then
   dirName = dirName & "\"
Endif
FileSize = 0
FileName = Dir$(dirName & "*.*")
Do While FileName <> ""
   FileSize = FileSize + _
       FileLen(dirName & FileName)
   FileName = Dir$
Loop
DirUsedBytes = FileSize
使用:
MsgBox DirUsedBytes("C:\Windows")




判断驱动器类型
   using GetDriveType to detect, below is the example for  detecting
   CD-ROM, others I am not try, you may look up the detail of the funtion,
   you can fix it.


   'Private Declare Function GetDriveType Lib "kernel32" Alias
   "GetDriveTypeA" (ByVal nDrive As String) As Long
   'Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias
   "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer
   As String) As Long
   'Private Const DRIVE_REMOVABLE = 2
   'Private Const DRIVE_FIXED = 3
   'Private Const DRIVE_REMOTE = 4
   'Private Const DRIVE_CDROM = 5
   'Private Const DRIVE_RAMDISK = 6



   'Place the following code in under a command button or in a menu, etc...


   Dim r&, allDrives$, JustOneDrive$, pos%, DriveType&
   Dim CDfound As Integer
   allDrives$ = Space$(64)
   r& = GetLogicalDriveStrings(Len(allDrives$), allDrives$)
   allDrives$ = Left$(allDrives$, r&)
   Do
   pos% = InStr(allDrives$, Chr$(0))
   If pos% Then
       JustOneDrive$ = Left$(allDrives$, pos%)
       allDrives$ = Mid$(allDrives$, pos% + 1, Len(allDrives$))
       DriveType& = GetDriveType(JustOneDrive$)
       If DriveType& = DRIVE_CDROM Then
          CDfound% = True
          Exit Do
       End If
   End If
   Loop Until allDrives$ = "" Or DriveType& = DRIVE_CDROM
   If CDfound% Then
       label1 = "The CD-ROM drive on your system is drive " &
   UCase$(JustOneDrive$)
     Else: label1 = "No CD-ROM drives were detected on your system."
   End If



判断是否已经建立 Dial Up 连接
判断是否已经建立 Dial Up 连接 98-8-21
通过读取注册表, 可以知道该信息。
声明:
Public Const ERROR_SUCCESS = 0&
Public Const APINULL = 0&Public
Const HKEY_LOCAL_MACHINE = &H80000002
Public ReturnCode As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
函数:


Public Function ActiveConnection() As Boolean
Dim hKey As Long
Dim lpSubKey As String
Dim phkResult As Long
Dim lpValueName As String
Dim lpReserved As Long
Dim lpType As Long
Dim lpData As Long
Dim lpcbData As Long
ActiveConnection = False
lpSubKey = "System\CurrentControlSet\Services\RemoteAccess"
ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, _
phkResult)


If ReturnCode = ERROR_SUCCESS Then
hKey = phkResult
lpValueName = "Remote Connection"
lpReserved = APINULL
lpType = APINULL
lpData = APINULL
lpcbData = APINULL
ReturnCode = RegQueryValueEx(hKey, lpValueName, _
lpReserved, lpType, ByVal lpData, lpcbData)
lpcbData = Len(lpData)
ReturnCode = RegQueryValueEx(hKey, lpValueName, _
lpReserved, lpType, lpData, lpcbData)


If ReturnCode = ERROR_SUCCESS Then
If lpData = 0 Then
ActiveConnection = False
Else
ActiveConnection = True
End If
End If


RegCloseKey (hKey)
End If


End Function



判断是否在 VB5 环境下运行
判断是否在 VB5 环境下运行 98-7-30
声明:
Private Declare Function GetModuleFileName Lib "kernel32" Alias _ "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As _ String, ByVal nSize As Long) As Long
函数:
' True 表示在  VB5 环境下运行
Function IsRunUnderVB5() As Boolean
 Dim S As String, Length
 Length = 256
 S = String(Length, 0)
 Call GetModuleFileName(0, S, Length)
 S = Left(S, InStr(S, Chr(0)) - 1)
 IsRunUnderVB5 = UCase(Right(S, 7)) = "VB5.EXE"
End Function