6、用VB开发应用
![](/icons/65524chengxu.gif)
如何使用INI文件 为了方便用户使用和使系统具有灵活性
![](/icons/65524dou.gif)
大多数Win-dows应用
![](/icons/65524chengxu.gif)
将用户所做
![](/icons/65524de.gif)
选择以及各种变化
![](/icons/65524de.gif)
系统信息记录在
![](/icons/65524chushi.gif)
化(INI)文件中
![](/icons/65524dou2.gif)
因此
![](/icons/65524dou.gif)
当系统
![](/icons/65524de.gif)
环境发生变化时
![](/icons/65524dou.gif)
可以直接修改INI文件
![](/icons/65524dou.gif)
而无需修改
![](/icons/65524chengxu.gif)
![](/icons/65524dou2.gif)
由此可见
![](/icons/65524dou.gif)
INI文件对系统功能是至关重要
![](/icons/65524de.gif)
![](/icons/65524dou2.gif)
本文将介绍采用VisualBasicforWindows(下称VB)开发Windows应用
![](/icons/65524chengxu.gif)
时如何读写INI文件
![](/icons/65524dou2.gif)
INI文件是文本文件
![](/icons/65524dou.gif)
由若干部分(section)组成
![](/icons/65524dou.gif)
在每个带括号
![](/icons/65524de.gif)
标题下面
![](/icons/65524dou.gif)
是若干个以单个单词开头
![](/icons/65524de.gif)
关键词(keyword)和
![](/icons/65524yi.gif)
个等号
![](/icons/65524dou.gif)
每个关键词会控制应用
![](/icons/65524chengxu.gif)
某个功能
![](/icons/65524de.gif)
工作方式
![](/icons/65524dou.gif)
等号右边
![](/icons/65524de.gif)
值(value)指定关键词
![](/icons/65524de.gif)
操作方式
![](/icons/65524dou2.gif)
其
![](/icons/65524yi.gif)
般形式如下:
[section1]
keyword1=valuel
keyword2=value2
……
[section2]
keyword1=value1
keyword2=value2
……
其中
![](/icons/65524dou.gif)
如果等号右边无任何内容(即value为空)
![](/icons/65524dou.gif)
那就表示Windows应用
![](/icons/65524chengxu.gif)
已为该关键词指定了缺省值
![](/icons/65524dou.gif)
如果在整个文件中找不到某个关键词(或整个
![](/icons/65524yi.gif)
部分)
![](/icons/65524dou.gif)
那同样表示为它们指定了缺省值
![](/icons/65524dou2.gif)
各个部分所出现
![](/icons/65524de.gif)
顺序是无关紧要
![](/icons/65524de.gif)
![](/icons/65524dou.gif)
在每
![](/icons/65524yi.gif)
个部分里
![](/icons/65524dou.gif)
各个关键词
![](/icons/65524de.gif)
顺序同样也无关紧要
![](/icons/65524dou2.gif)
读写INI文件通常有两种方式:
![](/icons/65524yi.gif)
是在Windows中用"记事本"(Notepad)对其进行编辑
![](/icons/65524dou.gif)
比较简单
![](/icons/65524dou.gif)
无需赘述; 2是由Windows应用
![](/icons/65524chengxu.gif)
读写INI文件
![](/icons/65524dou.gif)
通常是应用
![](/icons/65524chengxu.gif)
运行时读取INI文件中
![](/icons/65524de.gif)
信息
![](/icons/65524dou.gif)
退出应用
![](/icons/65524chengxu.gif)
时保存用户对运行环境
![](/icons/65524de.gif)
某些修改
![](/icons/65524dou2.gif)
关键词
![](/icons/65524de.gif)
值
![](/icons/65524de.gif)
类型多为
![](/icons/65524zifu.gif)
串或整数型
![](/icons/65524dou.gif)
应分两种情况读写
![](/icons/65524dou2.gif)
为了使
![](/icons/65524chengxu.gif)
具有可维护性和可移植性
![](/icons/65524dou.gif)
最好把对INI文件
![](/icons/65524de.gif)
读写封装在
![](/icons/65524yi.gif)
个模块(RWINI.BAS)中
![](/icons/65524dou.gif)
在RWI-NI.BAS中构造GetIniS和GetIniN
![](/icons/65524hanshu.gif)
以及SetIniS和Se-tIniN过程
![](/icons/65524dou.gif)
在这些
![](/icons/65524hanshu.gif)
和过程中需要使用WindowsAPI
![](/icons/65524de.gif)
"GetPrivateprofileString"、"GetPrivateProfileInt"和"WritePrivateProfileString"
![](/icons/65524hanshu.gif)
![](/icons/65524dou2.gif)
RWINI.BAS模块
![](/icons/65524de.gif)
![](/icons/65524chengxu.gif)
代码如下:
在General-Declearation部分中声明使用到
![](/icons/65524de.gif)
WindowsAPI
![](/icons/65524hanshu.gif)
:
Declare Function GetprivateprofileString Lib"Ker-nel"(ByVallpAppName As String
ByVallpKeyName As String
ByVallpDefault As String
ByVal lpRetrm-String As String
ByVal cbReturnString As Integer
ByVal Filename As String)As Integer
Declare FunctionGetPrivatePfileInt Lib "Kernel"(ByVal lpAppName As String
ByVal lpKeyName As String
ByVal lpDefault As Integer
ByVal Filename As String)As Integer
Declare FuncitonWritePrivateprofileString Lib "Kernel"(ByVal lpApplicationName As String
ByVal lpKeyName As String
ByVal lpString As String
ByVal lplFileName As String)As Integer
Function GetIniS(ByVal SectionName As String
ByVal KeyWord As String
ByVal DefString As String)As String
Dim ResultString As String * 144
Temp As Integer
Dims As String
i As Integer
Temp%=GetPrivateProfileString(SectionName
KeyWord
""
ResultString
144
AppProfileName
)
‘检索关键词
值
IfTemp%>0Then‘关键词
值不为空
s=""
Fori=1To144
IfAsc(Mid$(ResultString
I
1))=0Then
ExitFor
Else
s=s&Mid$(ResultString
I
1)
EndIf
Next
Else
Temp%=WritePrivateProfilesString(sectionname
KeyWord
DefString
ppProfileName
)
‘将缺省值写入INI文件
s=DefString
EndIf
GetIniS=s
EndFunction
FunctionGetIniN(ByValSectionNameAsString
ByValKeyWordAsString
ByValDefValue
AsIneger)AsInteger
DimdAsLong
sAsString
d=DefValue
GetIniN=GetPrivateProfileInt(SectionName![](/icons/65524dou.gif)
KeyWord
DefValue
ppProfileName
)
Ifd<>DefValueThen
s=""&d
d=WritePrivateProfileString(SectionName![](/icons/65524dou.gif)
KeyWord
s
AppProfileName
)
EndIf
EndFunction
SubSetIniS(ByValSectionNameAsString
BtVaKeyWordAsString
ByValValStr
AsString)
Dimres%
res%=WritePrivateprofileString(SectionName
KeyWord
ValStr
AppProfileName
)
EndSub
SubSetIniN(ByValSectionNameAsString
ByValKeyWordAsString
ByValValInt
AsInteger)
Dimres%
s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName
KeyWord
s$
AppProfileName
)
EndSub
SectionName为每
![](/icons/65524yi.gif)
部分
![](/icons/65524de.gif)
标题
![](/icons/65524dou.gif)
KeyWord为关键词
![](/icons/65524dou.gif)
GetIniS和GetIniN中
![](/icons/65524de.gif)
DefValue为关键词
![](/icons/65524de.gif)
缺省值
![](/icons/65524dou.gif)
SetIniS和SetIniN
![](/icons/65524de.gif)
ValStr和ValInt为要写入INI文件
![](/icons/65524de.gif)
关键词
![](/icons/65524de.gif)
值
![](/icons/65524dou2.gif)
为了能更好地介绍说明如何使用以上
![](/icons/65524hanshu.gif)
和过程
![](/icons/65524dou.gif)
下面举两个例子
![](/icons/65524dou2.gif)
例子1:
开发应用
![](/icons/65524chengxu.gif)
通常要使用数据库和其它
![](/icons/65524yi.gif)
些文件
![](/icons/65524dou.gif)
这些文件
![](/icons/65524de.gif)
目录(包括路径和文件名)不应在
![](/icons/65524chengxu.gif)
中固定
![](/icons/65524dou.gif)
而是保存在INI文件中
![](/icons/65524dou.gif)
![](/icons/65524chengxu.gif)
运行时由INI文件中读入
![](/icons/65524dou2.gif)
读入数据库文件
![](/icons/65524de.gif)
代码如下:
DimDatabasenameAsString
Databasename=GetIniS("数据库"
"职工"
"")
IfDatabaseName=""ThenDatabaseName=InputBox("请输入数据库
职工![](/icons/65524smhr.gif)
目录")![](/icons/65524dou.gif)
App.Title)’也可通过"文件对话框"进行选择
OnErrorResumeNext
Setdb=OpenDatabas(DatabaseName)
IfErr<>0Then
MsgBox"打开数据库失败!"
MB-
ICONSTOP
App.Title:GotoErrorProcessing
Else
SetIniS"数据库"
"职工"
DatabaseName
EndIf
OnErrorGoTo0
……
例子2:
为了方便用户操作
![](/icons/65524dou.gif)
有时需要保存用户界面
![](/icons/65524de.gif)
某些信息
![](/icons/65524dou.gif)
例如窗口
![](/icons/65524de.gif)
高度和宽度等
![](/icons/65524dou2.gif)
装载窗体时
![](/icons/65524dou.gif)
从INI文件中读入窗体高度和宽度
![](/icons/65524dou.gif)
卸载窗体时将窗体当前高度和宽度存入INI文件
![](/icons/65524dou.gif)
代码如下:
Sub Form1_Load![](/icons/65524kh.gif)
……
Forml.Height=GetIniN("窗体1"
"高度"
6000)
Form1.Width=GetIniN("窗体1"
"高度"
4500)
EndSub
……
Sub Form1_Unload![](/icons/65524kh.gif)
……
SetIniN"窗体1"
"高度"
Me.Height
SetIniN"窗体1
"宽度"
Me.Width
……
End Sub
7、
![](/icons/65524chengxu.gif)
中如何启动默认
![](/icons/65524de.gif)
拨号连接 随着因特网
![](/icons/65524de.gif)
迅猛发展
![](/icons/65524dou.gif)
现在编程常需要在
![](/icons/65524chengxu.gif)
中直接联网来处理
![](/icons/65524yi.gif)
些事项
![](/icons/65524dou.gif)
如在线注册和在线帮助
![](/icons/65524dou.gif)
这就要求我们要在
![](/icons/65524chengxu.gif)
中建立某些连接
![](/icons/65524dou2.gif)
很多软件Software在不知用户是否联网
![](/icons/65524de.gif)
情况下不管 3 7 2十
![](/icons/65524yi.gif)
就启动浏览器查找网址
![](/icons/65524dou.gif)
费了 9牛 2虎的力只能查出
![](/icons/65524yi.gif)
![](/icons/65524cuowu.gif)
页来(当然不可能有什么好
![](/icons/65524de.gif)
结果)
![](/icons/65524dou2.gif)
如果我们在
![](/icons/65524chengxu.gif)
编写时能自动判断用户是否已经联网
![](/icons/65524dou.gif)
如已经联网则打开联接
![](/icons/65524dou.gif)
如没有则启动默认
![](/icons/65524de.gif)
拨号连接
![](/icons/65524dou.gif)
这样是不是让人觉得你
![](/icons/65524de.gif)
软件Software更胜人
![](/icons/65524yi.gif)
处呢?判断是否已联网很多地方都有介绍
![](/icons/65524dou.gif)
这里我们只介绍如何启动默认
![](/icons/65524de.gif)
拨号连接
![](/icons/65524dou2.gif)
---- 在介绍的前让我们首先看看如何打开拨号网络
![](/icons/65524dou2.gif)
由于拨号网络不是
![](/icons/65524yi.gif)
个可执行文件
![](/icons/65524dou.gif)
所以不能用 “Shell 可执行文件”
![](/icons/65524de.gif)
方式来打开
![](/icons/65524dou2.gif)
要启动拨号网络
![](/icons/65524dou.gif)
需借助 Explorer
![](/icons/65524dou.gif)
思路方法如下:
Shell "Explorer ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\" & "::{992CFFA0-F557-101A-88EC-00DD010CCC48}", vbNormalFocus
---- 但若是要启动拨号网络中
![](/icons/65524de.gif)
某
![](/icons/65524yi.gif)
个连接
![](/icons/65524dou.gif)
则需借助rundll.exe 及 rnaui.dll来启动
![](/icons/65524dou.gif)
思路方法如下(假定连接名称为163):
Shell "rundll rnaui.dll,RnaDial 163", vbNormalFocus
---- 介绍说明:在以上叙述中
![](/icons/65524dou.gif)
“,RnaDial 163”这部分不要插入额外
![](/icons/65524de.gif)
空格
![](/icons/65524dou.gif)
大小写也不要任意更改
![](/icons/65524dou2.gif)
---- 上面仅仅假定了连接名称
![](/icons/65524dou.gif)
但实际编程中我们是不知道其名称
![](/icons/65524de.gif)
![](/icons/65524dou.gif)
如何取得默认
![](/icons/65524de.gif)
连接名称并启动它呢?这里我们可利用注册表来达到目
![](/icons/65524de.gif)
![](/icons/65524dou2.gif)
完整
![](/icons/65524chengxu.gif)
如下:
---- 在窗体上放置
![](/icons/65524yi.gif)
个命令按钮(名称为 cmdCallConnect)
![](/icons/65524dou.gif)
下面为代码部份:
Option Explicit
'有关注册
API声明
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal szData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
'常数
Const HKEY_CURRENT_USER = &H80000001
Const ERROR_SUCCESS = 0&
Private Sub cmdCallConnect_Click![](/icons/65524kh.gif)
'启动默认拨号连接
Shell "rundll rnaui.dll,RnaDial " + GetConnect, vbNormalFocus
End Sub
Public Function GetConnect
As String
Dim hKey As Long
Dim SubKey As String
hKey = HKEY_CURRENT_USER '主键
SubKey = "RemoteAccess" '子键
'取得默认连接名
GetConnect = GetRegValue(hKey, SubKey, "Default")
End Function
Public Function GetRegValue(hKey As Long, lpszSubKey As String, szKey As String) As Variant
On Error GoTo ErrorRoutineErr:
Dim phkResult As Long
Dim lResult As Long
Dim szBuffer As String
Dim lBuffSize As Long
'创建缓冲区
szBuffer = Space(255)
lBuffSize = Len(szBuffer)
'打开注册键
RegOpenKeyEx hKey, lpszSubKey, 0, 1, phkResult
'查询结果
lResult = RegQueryValueEx(phkResult,szKey, 0, 0, szBuffer,lBuffSize)
'关闭注册键
RegCloseKey phkResult
'返回结果
If lResult = ERROR_SUCCESS Then
GetRegValue = Left(szBuffer, lBuffSize - 1)
Else
GetRegValue = ""
End If
Exit Function
ErrorRoutineErr:
GetRegValue = ""
End Function
以上
![](/icons/65524chengxu.gif)
在 WIN98,VB6.0 下调试通过
![](/icons/65524dou2.gif)
8、如何通过VB获取网卡地址 [功能描述] IPX和NETBIOS接口需要网络地址
![](/icons/65524dou2.gif)
该文通过详细
![](/icons/65524de.gif)
步骤演示了如何通过VB获取网卡地址
![](/icons/65524dou2.gif)
步骤:
1)在Visual Basic生成标准
![](/icons/65524de.gif)
EXE文件
![](/icons/65524dou2.gif)
缺省创建 Form1
![](/icons/65524dou2.gif)
2)在Form1中添加
![](/icons/65524yi.gif)
命令按钮
![](/icons/65524dou.gif)
缺省名为Command1
![](/icons/65524dou2.gif)
3)把下列代码放到Form1中介绍说明部分
![](/icons/65524dou2.gif)
Option Explicit
Private Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32
Private Type NCB
ncb_command As Byte 'Integer
ncb_retcode As Byte 'Integer
ncb_lsn As Byte 'Integer
ncb_num As Byte ' Integer
ncb_buffer As Long 'String
ncb_length As Integer
ncb_callname As String * NCBNAMSZ
ncb_name As String * NCBNAMSZ
ncb_rto As Byte 'Integer
ncb_sto As Byte ' Integer
ncb_post As Long
ncb_lana_num As Byte 'Integer
ncb_cmd_cplt As Byte 'Integer
ncb_reserve(9) As Byte ' Reserved, must be 0
ncb_event As Long
End Type
Private Type ADAPTER_STATUS
adapter_address(5) As Byte 'As String * 6
rev_major As Byte 'Integer
reserved0 As Byte 'Integer
adapter_type As Byte 'Integer
rev_minor As Byte 'Integer
duration As Integer
frmr_recv As Integer
frmr_xmit As Integer
rame_recv_err As Integer
xmit_aborts As Integer
xmit_success As Long
recv_success As Long
rame_xmit_err As Integer
recv_buff_unavail As Integer
t1_timeouts As Integer
ti_timeouts As Integer
Reserved1 As Long
free_ncbs As Integer
max_cfg_ncbs As Integer
max_ncbs As Integer
xmit_buf_unavail As Integer
max_dgram_size As Integer
pending_sess As Integer
max_cfg_sess As Integer
max_sess As Integer
max_sess_pkt_size As Integer
name_count As Integer
End Type
Private Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type
Private Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type
Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32"
As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long,ByVal dwFlags As Long, lpMem As Any) As Long
把下面
![](/icons/65524de.gif)
代码放入Command1_Click
![](/icons/65524de.gif)
事件中:
Private Sub Command1_Click![](/icons/65524kh.gif)
Dim myNcb As NCB
Dim bRet As Byte
myNcb.ncb_command = NCBRESET
bRet = Netbios(myNcb)
myNcb.ncb_command = NCBASTAT
myNcb.ncb_lana_num = 0
myNcb.ncb_callname = "* "
Dim myASTAT As ASTAT, tempASTAT As ASTAT
Dim pASTAT As Long
myNcb.ncb_length = Len(myASTAT)
Debug.Pr
Err.LastDllError
pASTAT = HeapAlloc(GetProcessHeap
, HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)
If pASTAT = 0 Then
Debug.Pr
"memory allcoation failed!"
Exit Sub
End If
myNcb.ncb_buffer = pASTAT
bRet = Netbios(myNcb)
Debug.Pr
Err.LastDllError
CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
MsgBox Hex(myASTAT.adapt.adapter_address(0)) & " " & Hex(myASTAT.adapt.adapter_address(1)) _
& " " & Hex(myASTAT.adapt.adapter_address(2)) & " " _
& Hex(myASTAT.adapt.adapter_address(3)) _
& " " & Hex(myASTAT.adapt.adapter_address(4)) & " " _
& Hex(myASTAT.adapt.adapter_address(5))
HeapFree GetProcessHeap
, 0, pASTAT
End Sub
4)按F5
![](/icons/65524dou.gif)
运行该
![](/icons/65524chengxu.gif)
![](/icons/65524dou2.gif)
5)点击Command1
![](/icons/65524dou2.gif)
注意
![](/icons/65524dou.gif)
网卡地址将在
![](/icons/65524yi.gif)
信息框中显示出来
![](/icons/65524dou2.gif)
9、如何使用 ADO 來压缩或修复 Microsoft Access 文件 以前使用 DAO 時
![](/icons/65524dou.gif)
Microsoft 有提供 CompactDatabase Method 來压缩 Microsoft Access 文件
![](/icons/65524dou.gif)
RepairDatabase Method 來修复损坏
![](/icons/65524de.gif)
Microsoft Access 文件
![](/icons/65524dou.gif)
![](/icons/65524dou2.gif)
可是自从 ADO 出來的后
![](/icons/65524dou.gif)
好像忘了提供相对
![](/icons/65524de.gif)
压缩及修复 Microsoft Access 文件
![](/icons/65524de.gif)
功能
![](/icons/65524dou2.gif)
現在 Microsoft 发现了这个问题了
![](/icons/65524dou.gif)
也提供了解決思路方法
![](/icons/65524dou.gif)
不过有版本上
![](/icons/65524de.gif)
限制!限制說明如下:
ActiveX Data Objects (ADO), version 2.1
Microsoft OLE DB Provider for Jet, version 4.0
這是 Microsoft 提出
![](/icons/65524de.gif)
ADO
![](/icons/65524de.gif)
延伸功能:Microsoft Jet OLE DB Provider and Replication Objects (JRO)
这个功能在 JET OLE DB Provider version 4.0 (Msjetoledb40.dll) 及 JRO version 2.1 (Msjro.dll) 中第
![](/icons/65524yi.gif)
次被提出!
這些必要
![](/icons/65524de.gif)
DLL 文件在您安裝了 MDAC 2.1 的后就有了
![](/icons/65524dou.gif)
您可以在以下
![](/icons/65524de.gif)
网页中下载 MDAC
![](/icons/65524de.gif)
最新版本!
Universal Data Access Web Site
在下载的前先到 VB6 中檢查
![](/icons/65524yi.gif)
下
![](/icons/65524dou.gif)
【Control控件】【設定引用項目】中
![](/icons/65524de.gif)
Microsoft Jet and Replication Objects X.X library 如果已经是 2.1 以上
![](/icons/65524de.gif)
版本
![](/icons/65524dou.gif)
您就可以不用下载了!
在您安裝了 MDAC 2.1 或以上
![](/icons/65524de.gif)
版本的后
![](/icons/65524dou.gif)
您就可以使用 ADO 來压缩或修复 Microsoft Access 文件
![](/icons/65524dou.gif)
下面
![](/icons/65524de.gif)
步骤告訴您如何使用 CompactDatabase Method 來压缩 Microsoft Access 文件:
1、新建
![](/icons/65524yi.gif)
個新表单
![](/icons/65524dou.gif)
选择功能表中
![](/icons/65524de.gif)
【Control控件】【設定引用項目】
![](/icons/65524dou2.gif)
2、加入 Microsoft Jet and Replication Objects X.X library
![](/icons/65524dou.gif)
其中 ( X.X 大于或等于 2.1 )
![](/icons/65524dou2.gif)
3、在适当
![](/icons/65524de.gif)
地方加入以下
![](/icons/65524de.gif)
![](/icons/65524chengxu.gif)
代码
![](/icons/65524dou.gif)
記得要修改 data source
![](/icons/65524de.gif)
內容及目地文件
![](/icons/65524de.gif)
路径:
Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb", _ '來源文件
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc2.mdb;Jet OLEDB:Engine Type=4" '目
![](/icons/65524de.gif)
文件
在 DAO 3.60 的后
![](/icons/65524dou.gif)
RepairDatabase Method 已经无法使用了
![](/icons/65524dou.gif)
以上
![](/icons/65524de.gif)
![](/icons/65524chengxu.gif)
代码显示了 ADO CompactDatabase Method
![](/icons/65524de.gif)
使用方法
![](/icons/65524dou.gif)
而它也取代了 DAO 3.5 時
![](/icons/65524de.gif)
RepairDatabase method!
10、如何设置对VB数据库连接
![](/icons/65524de.gif)
动态路径 我个人
![](/icons/65524yinwei.gif)
经常作
![](/icons/65524yi.gif)
些数据库方面
![](/icons/65524de.gif)
![](/icons/65524chengxu.gif)
![](/icons/65524dou.gif)
对于
![](/icons/65524chengxu.gif)
间如何和数据库进行接口
![](/icons/65524de.gif)
问题的烦是深有体会
![](/icons/65524dou.gif)
![](/icons/65524yinwei.gif)
VB在数据库链接
![](/icons/65524de.gif)
时候
![](/icons/65524dou.gif)
![](/icons/65524yi.gif)
般是静态
![](/icons/65524dou.gif)
即数据库存放
![](/icons/65524de.gif)
路径是固定
![](/icons/65524de.gif)
![](/icons/65524dou.gif)
如用VB
![](/icons/65524de.gif)
DATA
![](/icons/65524dou.gif)
adodc,DataEnvironment 等到作数据库链接时
![](/icons/65524dou.gif)
如果存放数据库
![](/icons/65524de.gif)
路径被改变
![](/icons/65524de.gif)
话
![](/icons/65524dou.gif)
就会找不到路经
![](/icons/65524dou.gif)
真是
![](/icons/65524yi.gif)
个特别烦
![](/icons/65524de.gif)
事
![](/icons/65524dou2.gif)
笔者
![](/icons/65524de.gif)
解决思路方法是利用app.path 来解决这个问题
![](/icons/65524yi.gif)
、用dataControl控件进行数据库链接
![](/icons/65524dou.gif)
可以这样:
在form_load
![](/icons/65524kh.gif)
过程中放入:
private form_load
![](/icons/65524kh.gif)
Dim str As String '定义
str = App.Path
If Right(str, 1) <> "\" Then
str = str + "\"
End If
data1.databasename=str & "\数据库名"
data1.recordsource="数据表名"
data1.refresh
sub end
这几句话
![](/icons/65524de.gif)
意为
![](/icons/65524dou.gif)
打开当前
![](/icons/65524chengxu.gif)
运行
![](/icons/65524de.gif)
目录下
![](/icons/65524de.gif)
数据库
![](/icons/65524dou2.gif)
你只要保证你
![](/icons/65524de.gif)
数据库在你
![](/icons/65524chengxu.gif)
所在
![](/icons/65524de.gif)
目录的下就行了
![](/icons/65524dou2.gif)
2、利用adodc(ADO Data Control)进行数据库链接:
private form_load
![](/icons/65524kh.gif)
Dim str As String '定义
str = App.Path
If Right(str, 1) <> "\" Then
str = str + "\"
End If
str = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & str & "\tsl.mdb"
Adodc1.ConnectionString = str
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "select * from table3"
Adodc1.Refresh
end sub
3、利用DataEnvironment进行数据库链接
可在过程中放入:
On Error Resume Next
If DataEnvironment1.rsCommand1.State <> adStateClosed Then
DataEnvironment1.rsCommand1.Close '如果打开
![](/icons/65524dou.gif)
则关闭
End If
'i = InputBox("请输入友人编号:", "输入")
'If i = "" Then Exit Sub
DataEnvironment1.Connection1.Open App.Path & "\userdatabase\tsl.mdb"
DataEnvironment1.rsCommand1.Open "select * from table3 where 编号='" & i & "'"
'Set DataReport2.DataSource = DataEnvironment1
'DataReport2.DataMember = "command1"
'DataReport2.show
end sub
4、利用ADO(ActiveX Data Objects)进行编程:
建立连接:
dim conn as
![](/icons/65524new.gif)
adodb.connection
dim rs as
![](/icons/65524new.gif)
adodb.record
![](/icons/65524set.gif)
dim str
str = App.Path
If Right(str, 1) <> "\" Then
str = str + "\"
End If
str = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & str & "\tsl.mdb"
conn.open str
rs.cursorlocation=aduseclient
rs.open "数据表名",conn,adopenkey
![](/icons/65524set.gif)
.adlockpessimistic
用完的后关闭数据库:
conn.close
![](/icons/65524set.gif)
conn=nothing