如题,谢谢!!

解决方案 »

  1.   

    使用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.   

    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
      

  3.   

    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数据源的注册,用户可以根据不同的需求选择使用 
      

  5.   

    兩種解決辦法: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
      
      '构造建立数据源的函数
      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註冊工具新建一個,然後到註冊表中進行查詢相應的參數即可
      

  6.   

    非常感谢各位的帮助!!!!to:yoki
      您说的方法很好用,但是我还有几个问题,麻烦您指点一下。
      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”?