使用rdo对象的rdoRegisterDataSource方法在程序内动态注册,这样就不存在“odbc打包”的问题了。具体方法如下: rdoRegisterDataSource 方法示例 下面示例说明使用 rdoRegisterDataSource 方法建立新的 ODBC 数据源项。 Private Sub RegisterDataSource() Dim en As rdoEnvironment Dim cnTest As rdoConnection Dim strAttribs As String '建造关键字字符串。 strAttribs = "Description=" _ & "SQL Server on server SEQUEL" _ & Chr$(13) & "OemToAnsi=No" _ & Chr$(13) & "SERVER=SEQUEL" _ & Chr$(13) & "Network=DBNMPNTW" _ & Chr$(13) & "Database=WorkDB" _ & Chr$(13) & "Address=\\SEQUEL\PIPE\SQL\QUERY"
'建立新的注册的 DSN。 rdoEngine.rdoRegisterDataSource "示例", _ "SQL Server", True, strAttribs '打开数据库。 Set en = rdoEngine.rdoEnvironments(0) Set cnTest = en.OpenConnection( _ dsname:="示例", _ Prompt:=rdDriverNoPrompt, _ Connect:="UID=;PWD=;")
End Sub RDO对象的全称为Microsoft Remote Data Objects,VB 6带有这个部件。如果你想运行上面的代码,可以在“引用”对话框中选择Microsoft Remote Data Objects 2.0。如果想在窗体使用RDO控件(类似Data控件),可以在“部件”对话框选择Microsoft RemoteData Control 6.0。
2: 引用 Microsoft OLE DB Service Component 1.0 TYPE library 和ADO然后添加如下代码Option Explicit Dim adoConn As ADODB.Connection Private Function BuildAdoConnection(ByVal ConnectionString As String) As String ' display the ADO Connection Window (ADO DB Designer) Dim dlViewConnection As MSDASC.DataLinks On Error GoTo Err_BuildAdoConnection
If Not (Trim$(ConnectionString) = "") Then Set adoConn = New ADODB.Connection adoConn.ConnectionString = ConnectionString Set dlViewConnection = New MSDASC.DataLinks dlViewConnection.hWnd = Me.hWnd If dlViewConnection.PromptEdit(adoConn) Then BuildAdoConnection = adoConn.ConnectionString Else BuildAdoConnection = ConnectionString End If Set dlViewConnection = Nothing Set adoConn = Nothing Else Set dlViewConnection = New MSDASC.DataLinks dlViewConnection.hWnd = Me.hWnd Set adoConn = dlViewConnection.PromptNew BuildAdoConnection = adoConn.ConnectionString Set dlViewConnection = Nothing Set adoConn = Nothing End IfExit_BuildAdoConnection: On Error Resume Next If Not (adoConn Is Nothing) Then Set adoConn = Nothing End If If Not (dlViewConnection Is Nothing) Then Set dlViewConnection = Nothing End If On Error GoTo 0 Exit FunctionErr_BuildAdoConnection: Select Case Err Case 0 Resume Next Case -2147217805 adoConn.ConnectionString = "" Resume Case 91 Resume Exit_BuildAdoConnection Case Else MsgBox "Error: " & Err.Number & vbCrLf & vbCrLf & Err.Description, vbInformation, App.Title & " - Advisory" Resume Exit_BuildAdoConnection End Select
End Function
Private Sub Command1_Click() Set adoConn = New ADODB.Connection Dim strAdoConn As String strAdoConn = BuildAdoConnection("") 'strAdoConn 为连接字符串 MsgBox strAdoConn End Sub
兩種解決辦法:1.改用ADO連接資料庫,這樣用專用接口,不用配置ODBC.Option Explicit'工程->引用->Microsoft ActiveX Data Objects 2.0 Library (后面为版本号) Dim cn As New ADODB.Connection Dim rs As New ADODB.RecordsetPrivate Sub Combo1_Click() rs.Open "SELECT * FROM TABLENAME WHERE NAME = '" & txtName.Text & "'", cn, adOpenDynamic, adLockOptimistic If Not rs.EOF Then Label1.Caption = rs!ID Label2.Caption = rs!Memo End If
rs.AddNew rs!ID = "编号" rs!Memo = "备注" rs.Update End SubPrivate Sub Form_Load() cn.ConnectionString = "DBQ=" & App.Path & "\TelePhone.mdb;DefaultDir=" & _ App.Path & ";Driver={Microsoft Access Driver (*.mdb)};" & _ "DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;" & _ "MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;" & _ "Threads=3;UID=ADMIN;UserCommitSync=Yes;PWD=admind1234;" cn.Open '查询字符串可以上这里查 'http://www.connectionstrings.com/ End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) On Error Resume Next rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub 2.用API函數手動創建ODBC!!在模块中: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'在窗口中 Dim StrAttributes As String
rdoRegisterDataSource 方法示例
下面示例说明使用 rdoRegisterDataSource 方法建立新的 ODBC 数据源项。
Private Sub RegisterDataSource()
Dim en As rdoEnvironment
Dim cnTest As rdoConnection
Dim strAttribs As String
'建造关键字字符串。
strAttribs = "Description=" _
& "SQL Server on server SEQUEL" _
& Chr$(13) & "OemToAnsi=No" _
& Chr$(13) & "SERVER=SEQUEL" _
& Chr$(13) & "Network=DBNMPNTW" _
& Chr$(13) & "Database=WorkDB" _
& Chr$(13) & "Address=\\SEQUEL\PIPE\SQL\QUERY"
'建立新的注册的 DSN。
rdoEngine.rdoRegisterDataSource "示例", _
"SQL Server", True, strAttribs
'打开数据库。
Set en = rdoEngine.rdoEnvironments(0)
Set cnTest = en.OpenConnection( _
dsname:="示例", _
Prompt:=rdDriverNoPrompt, _
Connect:="UID=;PWD=;")
End Sub RDO对象的全称为Microsoft Remote Data Objects,VB 6带有这个部件。如果你想运行上面的代码,可以在“引用”对话框中选择Microsoft Remote Data Objects 2.0。如果想在窗体使用RDO控件(类似Data控件),可以在“部件”对话框选择Microsoft RemoteData Control 6.0。
引用
Microsoft OLE DB Service Component 1.0 TYPE library
和ADO然后添加如下代码Option Explicit
Dim adoConn As ADODB.Connection
Private Function BuildAdoConnection(ByVal ConnectionString As String) As String ' display the ADO Connection Window (ADO DB Designer) Dim dlViewConnection As MSDASC.DataLinks On Error GoTo Err_BuildAdoConnection
If Not (Trim$(ConnectionString) = "") Then
Set adoConn = New ADODB.Connection
adoConn.ConnectionString = ConnectionString
Set dlViewConnection = New MSDASC.DataLinks
dlViewConnection.hWnd = Me.hWnd
If dlViewConnection.PromptEdit(adoConn) Then
BuildAdoConnection = adoConn.ConnectionString
Else
BuildAdoConnection = ConnectionString
End If
Set dlViewConnection = Nothing
Set adoConn = Nothing
Else
Set dlViewConnection = New MSDASC.DataLinks
dlViewConnection.hWnd = Me.hWnd
Set adoConn = dlViewConnection.PromptNew
BuildAdoConnection = adoConn.ConnectionString
Set dlViewConnection = Nothing
Set adoConn = Nothing
End IfExit_BuildAdoConnection: On Error Resume Next
If Not (adoConn Is Nothing) Then
Set adoConn = Nothing
End If
If Not (dlViewConnection Is Nothing) Then
Set dlViewConnection = Nothing
End If
On Error GoTo 0
Exit FunctionErr_BuildAdoConnection: Select Case Err
Case 0
Resume Next
Case -2147217805
adoConn.ConnectionString = ""
Resume
Case 91
Resume Exit_BuildAdoConnection
Case Else
MsgBox "Error: " & Err.Number & vbCrLf & vbCrLf & Err.Description, vbInformation, App.Title & " - Advisory"
Resume Exit_BuildAdoConnection
End Select
End Function
Set adoConn = New ADODB.Connection
Dim strAdoConn As String
strAdoConn = BuildAdoConnection("") 'strAdoConn 为连接字符串
MsgBox strAdoConn
End Sub
一、手工配置
1.ODBC数据源管理器
在进行数据库开发时,为了达到配置ODBC,进行DSN定义注册的目的,微软给出了一个手工操作的解决方法。在Windows 9X操作系统的控制面板中,有一个名为“ODBC数据源(32位)”的图标,可以通过它激活专门为用户设置ODBC环境的程序(ODBC Data Source Administrator,ODBC数据源管理器)。在Windows 2000操作系统中,上述图标被放置在控制面板的“管理工具”里面。
这个用于设置ODBC环境的程序叫做桌面驱动程序,它支持数种DBMS(Database Management System,数据库管理系统)。当用户想增加一个数据源和一个所需要的驱动程序时,可以通过ODBC数据源管理器的配置对话框配置特定类型的数据库。大多数情况下,在编写对数据库操作的程序时,我们至少需要知道诸如数据库文件名、系统(本地或远程)、文件夹等信息,同时要给数据源命名。
2.定义数据源的类型
用户可以定义以下三种类型的数据源:
●用户数据源:作为位于计算机本地的用户数据源而创建的,并且只能被创建这个数据源的用户所使用;
●系统数据源:作为属于计算机或系统而不是特定用户的系统数据源而创建的,用户必须有访问权才能使用;
●文件数据源:指定到文件中作为文件数据源而定义的,任何已经正确地安装了驱动程序的用户皆可以使用这种数据源。
3.数据源注册的步骤
以Microsoft Access为例,如果在C:\myfile\文件夹里创建了一个名为myexample.mdb的数据库文件,其注册步骤如下:
●在控制面板里找到“ODBC数据源”图标,打开数据源管理器的交互界面;
●笔者创建的数据库文件是供本机上的用户使用的,所以这里选择“用户 DSN”;
●然后按下“添加”按钮,在弹出的数据源管理器对话框里,为自己所要创建的数据源选择一个驱动程序,本文的数据库文件是用Microsoft Access创建的,所以要选择“Microsoft Access Driver (*.mdb)”;
●按“完成”按钮后,进入一个标题为“ODBC Microsoft Access 安装”的界面,在其中设置“数据源名”为“mydatasource”,选取数据库文件 “C:\myfile\myexample.mdb”,然后确定即可。
这样我们就完成了一个简单的ODBC数据源的注册。当然,在以上的步骤中,用户可以根据自己的不同需要,设置不同的选项。
注册结束后,我们便可以在对数据库的编程中,操作该数据库了。
二、在VB中注册数据源
在VB中对数据库进行编程时,可以利用RegisterDataSource方法为ODBC数据源输入连接信息到 Windows 注册表中。它的语法是:
RegisterDataSource DSN, driver, silent, attributes
其中参数代表的含义分别为:
●DSN:字符串表达式,它是在引用数据源描述信息块时所使用的名字。例如,如果数据源是一个ODBC远程数据库,这就是服务器的名字;如果是用户DSN,则是注册的数据源的名字。
●drive:字符串表达式,表示ODBC驱动程序的名称。它并不是 ODBC 驱动程序动态连接库 (DLL) 文件名。例如,SQL Server 是驱动程序名,而 SQLSRVR.DLL 是 DLL 文件名。必须安装ODBC 及相应的驱动程序。
●silent:布尔类型值,如果不想显示 ODBC 驱动程序对话框,用以提示指定驱动程序的信息,该值就为 True;如果希望显示 ODBC 驱动程序对话框,该值就为 False。如果 silent 为 True,那么attributes必须包含所有必需的指定驱动程序的信息。
●attributes:字符串表达式,它是一个要添加到 ODBC.INI 文件中的关键字列表。编写程序时,可以根据需要选择若干attributes的参数进行设置。
例如:我们可以编写如下的VB程序,达到与上面手工注册一样的目的。程序清单如下:
Sub RegisterDataSource()
Dim strAttribs As String
’建造关键字字符串。
’C:\myfile\myexample.l.mdb数据库文件名(包含路径)
strAttribs =“DBQ=” _
& “C:\myfile\myexample.mdb” _
& Chr$(13) & “OemToAnsi=No” _
& Chr$(13) & “SERVER=SEQUEL” _
& Chr$(13) & “Network=DBNMPNTW” _
& Chr$(13) & “Database=WorkDB”_
& Chr$(13) &“Address=\\SEQUEL\PIPE\SQL\QUERY”
’建立新的注册的 DSN。
rdoEngine.rdoRegisterDataSource “mydatasource”,
“Microsoft Access Driver (*.mdb)”, True,
strAttribs
End Sub
Private Sub Form_Load()
Call rdoRegisterDataSource
End Sub
注意:为了在代码中使用rdoEngine和远程数据对象,必须先在“引用"对话框中设置一个到 Microsoft Remote Data Object 2.0 对象库的引用,否则在第一次引用rdoEngine 对象时会导致编译错误。
三、利用注册表合并
1.解决思路
考查ODBC数据源注册后对Windows注册表的修改情况,我们可以发现所注册的数据源对Windows注册表的影响关键集中在[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI]里。
这样,我们导出[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI],每次以之为模板,把所要注册的数据源信息加入到注册表导出文件的对应位置,然后再将该文件与系统注册表合并即可。
2.具体操作
首先,我们要弄清楚Regedit 及其参数的含义。Regedit是打开系统注册表的命令。在“开始\运行\”中输入即可。它的三个参数含义如下:
●Regedit /e myfile.reg :表示把注册表文件导出到myfile.reg 文件中,相当于复制整个注册表文件到myfile.reg中;
●Regedit /c myfile.reg:表示把myfile.reg导入注册表,相当于用该文件的内容覆盖了注册表的内容;
●Regedit /s myfile.reg :表示把myfile.reg文件的内容与注册表文件的内容进行合并。
我们只需在注册表中将有用的部分导出,而后将所要注册的数据源的信息加入,再与系统注册表合并就可以了。这个合并的过程,我们既可以手工输入来实现,也可以通过编程实现自动合并。
注意:为了防止误操作,一定要将系统注册表作一次备份。
小 结
从安全的角度考虑,笔者首推利用在Windows控制面板中的ODBC数据源管理工具来进行数据源注册,以免因对注册表的不熟或疏忽造成不必要的损失。当然,还有一些应用工具,可以实现对ODBC数据源的注册,用户可以根据不同的需求选择使用
Dim cn As New ADODB.Connection
Dim rs As New ADODB.RecordsetPrivate Sub Combo1_Click()
rs.Open "SELECT * FROM TABLENAME WHERE NAME = '" & txtName.Text & "'", cn, adOpenDynamic, adLockOptimistic
If Not rs.EOF Then
Label1.Caption = rs!ID
Label2.Caption = rs!Memo
End If
rs.AddNew
rs!ID = "编号"
rs!Memo = "备注"
rs.Update
End SubPrivate Sub Form_Load()
cn.ConnectionString = "DBQ=" & App.Path & "\TelePhone.mdb;DefaultDir=" & _
App.Path & ";Driver={Microsoft Access Driver (*.mdb)};" & _
"DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;" & _
"MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;" & _
"Threads=3;UID=ADMIN;UserCommitSync=Yes;PWD=admind1234;"
cn.Open
'查询字符串可以上这里查
'http://www.connectionstrings.com/
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error Resume Next
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
2.用API函數手動創建ODBC!!在模块中: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'在窗口中
Dim StrAttributes As String
'构造建立数据源的函数
StrAttributes = "DSN=orient_oa" & Chr(0) & "Database=orientnbcws" & Chr(0)
StrAttributes = StrAttributes & "Description=MySQL ODBC 3.51 Driver DSN" & Chr(0)
StrAttributes = StrAttributes & "Option=3" & Chr(0) & "Password=" & Chr(0) & "Port=3306" & Chr(0)
StrAttributes = StrAttributes & "Server=SERVERNAME" & Chr(0) & "Stmt=" & Chr(0) & "User="
'建立 ODBC 数据源
Call LoadDbSource2("MySQL ODBC 3.51 Driver", StrAttributes)
'连接数据库 通过ODBC
cn.ConnectionString = "DSN=orient_oa;UID=orientwarn;PWD=;"
這是建立一個MYSQL的ODBC,其他類型的ODBC可以事先用系統的ODBC註冊工具新建一個,然後到註冊表中進行查詢相應的參數即可
您说的方法很好用,但是我还有几个问题,麻烦您指点一下。
1、如下的关键字字符串strAttribs中的参数都代表什么意思呢?
strAttribs = "Description=" _
& "SQL Server on server SEQUEL" _
& Chr$(13) & "OemToAnsi=No" _
& Chr$(13) & "SERVER=SEQUEL" _
& Chr$(13) & "Network=DBNMPNTW" _
& Chr$(13) & "Database=WorkDB" _
& Chr$(13) & "Address=\\SEQUEL\PIPE\SQL\QUERY"
2、我建立的是“用户DSN”,请问如何建立“系统DSN”?