王朝网络
分享
 
 
 

在VB中动态加载ODBC数据源

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

在编写数据库应用程序时,常常需要用户自己在控制面板中配置ODBC数据源。然而对一般用户而言,配置ODBC数据源的工作是有一定困难的。因此,如果能在程序中动态加载ODBC数据源,就能大大方便应用程序最终用户的使用。本文介绍在VB中动态加载ODBC数据源的两种方法。

方法之一:修改注册表

一般情况下,用户在控制面板中配置好ODBC数据源后,Windows系统会将用户配置的信息写在注册表中。当应用程序需要用到数据源时,Windows会通知底层接口查阅注册表中该数据源的配置。例如,如果配置了系统数据源,Windows系统会根据配置修改注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 主键。因此,我们只要在应用程序中使用API函数来完成Windows对注册表所做的工作,就可以达到动态加载数据源的目的。

对于不同类型的数据源,注册表修改的内容也会各有不同,但基本上都要修改两个地方:一个是在ODBC.INI子键下建立与数据源配置相关的项;另一个是在\ODBC.INI\ODBC Data Source子键下建立一个新项,以告诉驱动程序管理器ODBC数据源的类型信息。

下面以配置一个ODBC系统数据源为例,给出一段动态加载Access数据源的VB例程:

Public Function LoadDbSource(StrSourceName, StrSourceDB, StrDescription As String) As Boolean

Dim hKey As Long ’要打开的注册表键句柄

Dim lReturn As Long ’注册表API函数的执行返回值

Dim StrSubKey As String ’要打开的子键

Dim Buffer As String * 255

Dim StrSysDir As String

Dim StrDbq, StrDriver, StrFil, StrUid As String

Dim LngDriverID, LngSafeTransactions As Long

Dim StrImplict, StrUserCommit As String

Dim LngPageTimeout, LngThreads, LngMaxBufferSize As Long

Dim StrDbType As String

’检测是否安装 Access ODBC 驱动 odbcjt32.dll

lReturn = GetSystemDirectory(Buffer, 255)

StrSysDir = Left(Buffer, lReturn) ’获取Windows系统目录

StrDriver = StrSysDir & "\odbcjt32.dll"

If Dir(StrDriver) = "" Then

MsgBox "您的计算机中没有安装Access的ODBC驱动程序odbcjt32.dll,无法加载数据源。", vbOKOnly + vbCritical

LoadDbSource = False

Exit Function

End If

StrSubKey = "SOFTWARE\ODBC\ODBC.INI" & "\" & StrSourceName

lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey)

If lReturn <> ERROR_SUCCESS Then

LoadDbSource = False

Else

StrDbq = StrSourceDB

LngDriverID = 25

StrFil = "MS Access;" ’文件类型"MS Access" for Microsoft Access

LngSafeTransactions = 0

Call RegSetValueEx(hKey, "DBQ", 0&, REG_SZ, StrDbq, LenB(StrDbq))

Call RegSetValueEx(hKey, "Description", 0&, REG_SZ, StrDescription, LenB(StrDescription))

Call RegSetValueEx(hKey, "Driver", 0&, REG_SZ, StrSourceDB, LenB(StrSourceDB))

Call RegSetValueEx2(hKey, "DriverID", 0&, REG_DWORD, LngDriverID, 4)

Call RegSetValueEx(hKey, "FIL", 0&, REG_SZ, StrFil, LenB(StrFil))

Call RegSetValueEx(hKey, "UID", 0&, REG_SZ, "", LenB(""))

Call RegSetValueEx2(hKey, "SafeTransaction", 0&, REG_DWORD, LngSafeTransactions, 4)

Call RegCloseKey(hKey)

StrSubKey = StrSubKey & "\Engines\Jet"

lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey)

If lReturn <> ERROR_SUCCESS Then

LoadDbSource = False

Else

StrImplict = ""

StrUserCommit = "Yes"

LngPageTimeout = 5

LngThreads = 3

LngMaxBufferSize = 2048

Call RegSetValueEx(hKey, "ImplictCommitSync", 0&, REG_SZ, StrImplict, LenB(StrImplict))

Call RegSetValueEx2(hKey, "MaxBufferSize", 0&, REG_DWORD, LngMaxBufferSize, 4)

Call RegSetValueEx2(hKey, "PageTimeout", 0&, REG_DWORD, LngPageTimeout, 4)

Call RegSetValueEx2(hKey, "Threads", 0&, REG_DWORD, LngThreads, 4)

Call RegSetValueEx(hKey, "UserCommitSync", 0&, REG_SZ, StrUserCommit, LenB(StrUserCommit))

Call RegCloseKey(hKey)

’设置ODBC数据库引擎名称

lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", 0&, KEY_WRITE, hKey)

If lReturn <> ERROR_SUCCESS Then

LoadDbSource = False

Else

StrDbType = "Microsoft Access Driver (*.mdb)"

lReturn = RegSetValueEx(hKey, StrSourceName, 0&, REG_SZ, StrDbType, LenB(StrDbType))

If lReturn = ERROR_SUCCESS Then LoadDbSource = True

End If

End If

End If

End Function

在上面的程序中使用了标准的Win32 API注册表操作函数,在VB "API文本浏览器"工具和MSDN中可以很容易查到其详细说明。

方法之二:使用ODBC DLL提供的函数

Windows系统目录中提供有一系列专门操作ODBC的动态链接库,其中Odbcinst.dll提供了一个可以动态的增加、删除和修改数据源的函数SQLConfigDataSource()。微软在MSDN的帮助文档中提供了对该函数的详细使用说明:

BOOL SQLConfigDataSource(

HWND hwndParent,

WORD fRequest,

LPCSTR lpszDriver,

LPCSTR lpszAttributes);

其中:hwndParent为调用窗体句柄;fRequest为操作码,通过设置不同的值可以实现对数据源的增加、删除、修改操作,这些对应值可以在MSDN中查到;lpszDriver参数传递数据库引擎,lpszAtrributes是配置信息列表,配置信息条目之间以字符代码Chr(0)分隔。同样,我们以上面的Access数据源配置为例写一个标准函数:

Private Const ODBC_ADD_SYS_DSN = 4

Private Declare Function SQLConfigDataSource Lib "odbccp32.dll" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Public Function LoadDbSource2(StrDriver, StrAttributes As String) As Boolean

LoadDbSource2 = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, StrDriver, StrAttributes)

End Function

在VB程序中调用这个标准例程:

Dim StrAttributes As String

StrAttributes = "DSN=AccessODBC2" & Chr(0) & "Desciption=动态加载ODBC示例" & Chr(0)

StrAttributes = StrAttributes & "Dbq=" & App.Path & "\MyDb.mdb" & Chr(0) & "FIL=MS Access;" & Chr(0)

StrAttributes = StrAttributes & "MaxBufferSize=2048" & Chr(0) & "PageTimeout=5" & Chr(0)

Call LoadDbSource2("Microsoft Access Driver (*.mdb)", StrAttributes)

上述两种方法都可以实现VB动态加载ODBC数据源,对于不同类型的数据源,注册表中记录的内容会有一些不同。所以,除查阅有关文档外,程序员可以先通过手工在控制面板中配置数据源,然后再通过观察注册表中的内容再进行编程。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有