...

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2589/2589364.xml?temp=.7908289
      

  2.   

    创建SQL Server的ODBC数据源如下:Private Const ODBC_ADD_DSN = 1        ' Add data source
    Private Const ODBC_CONFIG_DSN = 2    ' Configure (edit) data source
    Private Const ODBC_REMOVE_DSN = 3    ' Remove data source
    Private Const vbAPINull As Long = 0&  ' NULL Pointer
    Private Declare Function SQLAllocEnv Lib "odbc32.dll" (phenv&) As Integer
    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'********************************************
    '函数:创建SQL DSN
    Public Function CreateSQLDSN(ByVal DSN As String, ByVal Server As String, ByVal Database As String, _
                                  ByVal Driver As String, ByVal Description As String) As Boolean
        Dim strAttributes As String
        
        SQLConfigDataSource vbAPINull, ODBC_REMOVE_DSN, Driver, "DSN=" & DSN
        strAttributes = "DSN=" & DSN & Chr$(0) & _
                        "Description=" & Description & Chr$(0) & _
                        "Server=" & Server & Chr$(0) & _
                        "Database=" & Database & Chr$(0)
        If SQLConfigDataSource(vbAPINull, ODBC_ADD_DSN, Driver, strAttributes) = 0 Then
            CreateSQLDSN = False
        Else
            CreateSQLDSN = True
        End If
    End Function创建Foxpro(DBF)数据源如下:
    Private Const mc_RegKeyRun$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
    Private Declare Function RegCloseKey Lib "advapi32.dll" _
                    (ByVal Hkey As Long) As Long
    Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
                    (ByVal Hkey As Long, ByVal lpValueName As String) As Long
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
                    (ByVal Hkey As Long, ByVal lpSubKey As String, _
                    phkResult As Long) As Long
    Private 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
    Private 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
    Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
                    (ByVal Hkey As Long, ByVal lpSubKey As String, _
                    phkResult As Long) As Long
    Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
                    (ByVal Hkey As Long, ByVal lpSubKey As String) As Long
    Private Const REG_SZ = 1 ' Unicode nul terminated String
    Private Const REG_DWORD = 4 ' 32-bit number
    Private Const HKEY_CLASSES_ROOT = &H80000000
    Private Const HKEY_CURRENT_USER = &H80000001
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Const HKEY_USERS = &H80000003
    Private Const HKEY_PERFORMANCE_DATA = &H80000004
    Private Const ERROR_SUCCESS = 0&'**********************************************
    '函数:创建DBF DSN
    Public Function CreateDBFDSN(ByVal DSN As String, ByVal FilePath As String, ByVal Description As String) As Boolean
        Dim phkResult As Long
        Dim strRegVal As String
        Dim retVal As Boolean
        
        retVal = False
        On Error GoTo ErrProc    RegOpenKey HKEY_CURRENT_USER, "Software\ODBC\ODBC.INI\ODBC Data Sources", phkResult
        strRegVal = "Microsoft Visual Foxpro Driver"
        RegSetValueEx phkResult, DSN, 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        RegCloseKey phkResult    RegDeleteKey HKEY_CURRENT_USER, "Software\ODBC\ODBC.INI\" & DSN    RegCreateKey HKEY_CURRENT_USER, "Software\ODBC\ODBC.INI\" & DSN, phkResult
        strRegVal = "Yes"
        RegSetValueEx phkResult, "BackgroundFetch", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "Machine"
        RegSetValueEx phkResult, "Collate", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "Yes"
        RegSetValueEx phkResult, "Deleted", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = Description
        RegSetValueEx phkResult, "Description", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "C:\WINNT\System32\vfpodbc.dll"
        RegSetValueEx phkResult, "Driver", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "No"
        RegSetValueEx phkResult, "Exclusive", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "Yes"
        RegSetValueEx phkResult, "Null", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "No"
        RegSetValueEx phkResult, "SetNoCountOn", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = FilePath
        RegSetValueEx phkResult, "SourceDB", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2
        strRegVal = "DBF"
        RegSetValueEx phkResult, "SourceType", 0, REG_SZ, ByVal strRegVal, Len(strRegVal) + 2    RegCloseKey phkResult
        retVal = True
    ErrProc:
        CreateDBFDSN = retVal
    End Function
      

  3.   

    使用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。 
    引用
    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
      

  4.   

    几种注册ODBC数据源的方法 --------------------------------------------------------------------------------
    如果你有这个方面的问题请到数据库去提问或发表你的意见 
    来源:论坛转载无法确定出处,如有版权问题请与我们联系  一、手工配置 
      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数据源的注册,用户可以根据不同的需求选择使用