使用普通软件安装后(路径任意选择)就可直接应用了,它们是怎样连接所对应的数据库的呢?
我的程序是用vb和access数据库写的,我用了以下几种连接方法,都不理想:
方法一,我最先用的是ODBC来连接数据库的,但安装后必须由用户来手动连接数据库,肯定不好;
方法二,通过OleDb的Jet4.0引擎连接数据库的,然后用factory打包安装后发现程序不能启动,其后找到问题在于安装程序路径必须和数据库存放位置一致,否则就找不到数据库了,具体代码如下:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
ssrr = App.Path
If Right(ssrr, 1) <> "\" Then
   ssrr = ssrr + "\"
End If
ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;                    Data Source=" & ssrr & "指标库.mdb"
conn.ConnectionString = ssrr
conn.Open
rs.Open strsql, conn, adOpenDynamic, adCmdText
方法三,一位热心楼主告诉我建立一个UDL文件来连接数据库(正在调试中),但感觉也不太方便,在程序中要连接数据库的地方都必须加一段代码:
Public anCN As New ADODB.Connection
With anCN
        .ConnectionString = "FILE NAME=" & App.Path & "\ChingFeng.udl"
        .CursorLocation = adUseClient
        .Open
End With
方法四,另一位热心楼主告诉我通过ini文件来连接数据库,但没告诉具体方法。
请问各位楼主,最好连接数据库的方法是什么呢?还有更好的方法吗?谢谢你们能帮帮我!!!

解决方案 »

  1.   

    每一种方法有它自己的应用,每一种方法都是可以,要看使用的环境,所以不是方法不好,是你的选择不好
    1、从你使用的数据库来讲,你是使用access数据库,这种数据库是单机的,所以就排除方法1,3。
    2、从使用角度来讲,access相当文件,直接app.path就可以取得路径,除非有特殊需求(真有特殊需求,数据路径也可以写死),所以没必要再去操作ini,所以方法4排除,真正的方法只有2。3、为什么不选择1,3,4的原因
       不选择1:因为odbc只是对SQLserver数据库起作用,和access没关系。排除。
       不选择3:这个人写的方法是极特别的环境下,使用datalink文件去读,没必要使用,就算应用在SQL中间没特殊情况不使用。
       不选择4、同上4、对数据库操作只是路径问题,一般会放在你程序的同目录下,这样用app.path可取,放下级目录则加下级目录名字,没什么不好的,你用setupfactory打包找不到,是你程序的问题,或者你查看打包过后的安装脚本目录,有问题修改过来就可以
      

  2.   

    十分感谢你,daisy8675。我感觉你太专业了,但我还想问你:
    我的程序和数据库在打包时已成为一个安装文件,在安装时只可能在一个目录下面,但比如我的程序编写时在D区,安装时在E区,程序在执行时仍错误提示“在D区的指定目录下找不到数据库”,不知为何,恳求你给我详细解答,万分感谢!
      

  3.   

    ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;                    Data Source=" & app.path & "\指标库.mdb"
    conn.ConnectionString = ssrr
    conn.Open
    改你的数据连接
      

  4.   

    关注ing,学习ing,高手多讲讲!!
      

  5.   

    ,但比如我的程序编写时在D区,安装时在E区,程序在执行时仍错误提示“在D区的指定目录下找不到数据库”,
    //给编写有关系吗? 把你的access放进你编写的目录,安装时候自动会默认在安装跟目录下。
      

  6.   

    你打包时有没有把你的数据库也打进去阿?这样不论你的程序装在哪都是通过app.path来查找你的安装文件下的数据库了
      

  7.   

    access连接数据库就用第二种方法。SQL SERVER就用指定IP地址的方法,要不然就容易出错。
    例如:
       ConnectString1 = "Provider=SQLOLEDB.1;Data Source =" & "IP地址"_
                 & ";Initial Catalog=数据库名称;" _
                 & "User ID=sa;Password="
    打包软件用“InstallShield ”这个软件非常好。可以用一下试试!!
      

  8.   

    回复人: daisy8675(莫依) ( ) 信誉:136  2005-03-10 20:36:00  得分: 0  
     
     
       每一种方法有它自己的应用,每一种方法都是可以,要看使用的环境,所以不是方法不好,是你的选择不好
    1、从你使用的数据库来讲,你是使用access数据库,这种数据库是单机的,所以就排除方法1,3。
    2、从使用角度来讲,access相当文件,直接app.path就可以取得路径,除非有特殊需求(真有特殊需求,数据路径也可以写死),所以没必要再去操作ini,所以方法4排除,真正的方法只有2。3、为什么不选择1,3,4的原因
       不选择1:因为odbc只是对SQLserver数据库起作用,和access没关系。排除。
       不选择3:这个人写的方法是极特别的环境下,使用datalink文件去读,没必要使用,就算应用在SQL中间没特殊情况不使用。
       不选择4、同上4、对数据库操作只是路径问题,一般会放在你程序的同目录下,这样用app.path可取,放下级目录则加下级目录名字,没什么不好的,你用setupfactory打包找不到,是你程序的问题,或者你查看打包过后的安装脚本目录,有问题修改过来就可以
      
     
    =======================================================================
    1、谁说Access单机的数据库一定要排除用ODBC或udl文件或ini?
      有一天用户因为某些原因,认为Access数据库必须改变路径甚至改变文件时,用ODBC和udl是极好的选择,如果用2,你必须有一断程序用来指定Access的路径,而不是简单的用App.Path。ini方式同理3.1、不明白为什么说ODBC只对SQL Server数据库起作用的说法,ODBC支持的数据库并不比ADO少,只是因为效率比不上直接用ADO好所以不被人亲睐。对于本例,初学者学习使用,支持用方法2。
      

  9.   

    当你写一个数据访问服务层的组件时,你就会感受到udl带来的好处了,但直接使用udl最大的缺点是不安全性。
    读配置文件是个不错的选择。
      

  10.   

    1、谁说Access单机的数据库一定要排除用ODBC或udl文件或ini?
    //在这个问题之前请先分请粗豪什么叫 access和sqlserver楼主要习惯结帖,偶查一的帖,几乎没结的。呵呵,提醒下。
      

  11.   

    XunBaian(蓝水晶) :
     odbc是什么?你清楚这个问题吗?access是什么,你又清楚这个问题吗?
     odbc只是对sqlserver服务的,access只要用户机器上装office就使用的,完全不等同的类型。
     看来你对SQL和Access什么区别最基本的知识都还不清楚。
     有一天用户因为某些原因,认为Access数据库必须改变路径甚至改变文件时
    //你随便让用户改变的你的数据库,除非这个用户是吃抱没事做,当然一种情况除外,也就是我说过datalinks的特殊情况,那就是全然不知道用户使用什么的情况,用户自己去选择喜欢的数据库使用datalink
      

  12.   

    你在说什么啊,你不要跟我说SQL和Access的什么区别,我是什么都不知道,我只知道就楼主这例,他只是用了一个mdb的数据库而已,他也只是配置到ODBC数源而已,很简单的问题,你怎么说得如此的高深,你不要跟我说ODBC不能配置mdb的数据源,而是专门用来配置SQL Server的,那就真的成了低级笑话了。你认为用户将来要改变数据库是吃饱了没事做,只能说明你见得太少了,至少在工业控制方面这种情况实在太多了,而且你也没见过多层架构的软件系统,因为数据服务层正是不知道用户会用什么样的数据库,这太平常不过了,也给你说成了特殊情况,看来(通用)代码重用对你很难说得通!得罪之处还请见谅,只为楼主一个简单的应用给你说糊涂了,你不要说某某什么都不懂,要什么都懂也不会来这里和大家一起学习了。对了,为免大家误解,麻烦你说说odbc是什么,access又是什么,SQL 和Access的区别又是什么,这俩我用了好几年几乎用烂了,在你这里好象又有了新解,真诚请教!以上言论是指用VB、VC等开发工具编程读写数据库,而非使用数据库软件本身的功能。
      

  13.   

    哎哟,好了好了!
    ADO连接吧,就是你第二种啦,*.mdb放VB程序文件目录下下ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;                    Data Source=" & app.path & "\database\指标库.mdb"
    conn.ConnectionString = ssrr
      

  14.   

    不好意思,我看了一下 楼主的方法先进,学习!单机版的数据库程序我觉得真是没什么花头,不如用EXCEL写VBA得了,还这么费事套个界面!
    so大家眼光要开阔!学SQLSERVER吧 简单实际点
      

  15.   

    XunBaian(蓝水晶)
    //你好象挺有经验的,留个联系方式讨教下吧  !
      

  16.   

    虽然用VB和VC做软件开近五年了,但我也还是很多都不懂,讨教不敢,只想和大家探讨学习一下。[email protected]
      

  17.   

    我按下面的方式修改了程序,但只要数据库在‘编写程序时的路径’和‘安装存放时的路径’不一致就提示在“编写程序时的路径中找不到数据库”,这意味着我的程序并没有调用‘安装路径’中的数据库,而仍然在调用‘编写程序时路径’中的数据库,实在不知为何???(打包时已将数据库和安装文件包在一起了)下面是你们其中两位提示的方法:
    ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;                    Data Source=" & app.path & "\指标库.mdb"
    conn.ConnectionString = ssrr
    conn.Open
    我将我的一段程序贴在下面,请各位楼主指点,谢谢!(我的程序多处要调用数据库)
    Dim ssrr As String
      cbo1.AddItem "    "
      cbo1.AddItem "甲值"
      cbo1.AddItem "乙值"
      cbo1.AddItem "丙值"
      cbo1.AddItem "丁值"
      ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" &  App.Path & "\指标库.mdb"
      ado1.ConnectionString = ssrr
      ado1.CommandType = adCmdTable
      ado1.RecordSource = "select * from zb1"
      ado1.Recordset.Requery
      recs = ado1.Recordset.RecordCount
      If recs > 0 Then
         ado1.Recordset.MoveLast
      End If
      cbo1.Text = "    "
      moday.Year = Year(Date)
      moday.Month = Month(Date)
      moday.Day = Day(Date)
      ado1.Recordset.Requery
    End Sub
      

  18.   

    支持 XunBaian(蓝水晶) 的说法,
    莫大小姐对ODBC的认识也太片面了吧
    Open DataBase Connectivity(ODBC)
      

  19.   

    Const sPro As String = "provider=microsoft.jet.oledb.4.0;data source="
    Const sDBPWD As String = ";jet oledb:database password=shinesoftopt"
    '########数据库访问层##########
    '与C#不同,这里不能关闭内部对象及释放内存'sG_DBPath = sG_AppPath & "database\depot.mdb",定义在modGlobal模块中,全局变量'返回一个ADOCN连接对象,必须手动释放调用连接对象
    Public Function GetCN(sDBPath As String) As ADODB.Connection    Dim m_cn As ADODB.Connection
        
        
        On Error GoTo conerr
        Set m_cn = New ADODB.Connection
        
        m_cn.CursorLocation = adUseClient '客户端游标
        
        If m_cn.State <> adStateClosed Then m_cn.Close
        
        m_cn.Open sPro & sDBPath & sDBPWD
        
        Set GetCN = m_cn    Exit Function
    conerr:
        If Not m_cn Is Nothing Then
            If m_cn.State = adStateOpen Then m_cn.Close
        End If
        Set m_cn = Nothing
        
        MsgBox "数据库连接错误" & vbCrLf & err.Description, vbCritical, "数据库错误"End Function
      

  20.   

    我按下面的方式修改了程序,但程序仍然在“编写程序的路径中查找对应的数据库”,如果我把此路径中的数据库删除或移走,那程序执行时就提示在“编写程序时的路径中找不到数据库”,这意味着我的程序并没有调用‘安装路径’中的数据库(打包时已将数据库和安装文件包在一起了),而仍然在调用‘编写程序时路径’中的数据库,实在不知为何???下面是其中两位楼主提示的方法:
    ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;                    Data Source=" & app.path & "\指标库.mdb"
    conn.ConnectionString = ssrr
    conn.Open
    我将我的一段程序贴在下面,请各位楼主指点,谢谢!(我的程序多处要调用数据库)
    Dim ssrr As String
      cbo1.AddItem "    "
      cbo1.AddItem "甲值"
      cbo1.AddItem "乙值"
      cbo1.AddItem "丙值"
      cbo1.AddItem "丁值"
      ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" &  App.Path & "\指标库.mdb"
      ado1.ConnectionString = ssrr
      ado1.CommandType = adCmdTable
      ado1.RecordSource = "select * from zb1"
      ado1.Recordset.Requery
      recs = ado1.Recordset.RecordCount
      If recs > 0 Then
         ado1.Recordset.MoveLast
      End If
      cbo1.Text = "    "
      moday.Year = Year(Date)
      moday.Month = Month(Date)
      moday.Day = Day(Date)
      ado1.Recordset.Requery
    End Sub
      

  21.   

    用jet 最好了用个笨办法好了 先拖如 ado 控件然后 用jet 的字符窜连接,把那个字符窜复制下来就好用了。还有就是路尽问题 很简单 如果在程序目录下面,就用app.path如果不是 可以用 公共对话框来获得数据库的地址。
      

  22.   

    leehuang,你能说得详细些吗?
    在程序中我用datagrid连接adodc控件,而adodc通过下面的代码来连接数据库及其中的表,但出现错误提示“对象变量或with变量未设置”,(原来直接用adodc的属性来连接数据库,因为这样连接好像就不能改变数据库的路径,程序安装到其它机器上的任意路径中就会提示在‘原路径下’找不到数据库,但不会出现错误信息!!)代码如下:
    Private Sub Form_Load()
      Dim ssrr As String
      cbo1.AddItem "    "
      cbo1.AddItem "甲值"
      cbo1.AddItem "乙值"
      cbo1.AddItem "丙值"
      cbo1.AddItem "丁值"
      ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & App.Path & "\指标库.mdb"
      ado1.ConnectionString = ssrr
      ado1.RecordSource = "select * from zb1"
      ado1.CommandType = adCmdTable
      ado1.Recordset.Requery'执行到这条语句就出现上面的错误提示
      recs = ado1.Recordset.RecordCount'这条语句同样
      If recs > 0 Then
         ado1.Recordset.MoveLast'这条也一样
      End If
      cbo1.Text = "    "
      moday.Year = Year(Date)
      moday.Month = Month(Date)
      moday.Day = Day(Date)
      ado1.Recordset.Requery
      frm2.Visible = False
    End Sub
    不知何故,请各位楼主指点,谢谢!
      

  23.   

    代码部分是没问题的,去掉设计时控件ado1属性页里的设置,为ado1属性页里给的是绝对路径。建议不用控件,而用ADO对象。
      

  24.   

    请问xunbaian,ADO对象是不是这样?
    Dim m_cn As ADODB.Connection
    再引用ADO对象啊!
      

  25.   

    例如:
    引用“Microsoft ActiveX Data Objects 2.x Library”Private m_cnn As ADODB.Connection '数据连接对象
    Private m_rst As ADODB.Recordset '记录集Private Sub Class_Initialize()
       Set m_cnn = New ADODB.Connection
       Set m_rst = New ADODB.Recordset
       m_cnn.CursorLocation = adUseClient   m_cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & App.Path & "\指标库.mdb"
    End SubPrivate Sub Class_Terminate()
       If m_rst.State <> adStateClose Then
           m_rst.Close
       End If
       Set m_rst= Nothing
       If m_cnn.State <> adStateClose Then
           m_cnn.Close
       End If
       Set m_cnn = Nothing
    End SubPrivate Sub OpenDatabas()
       Dim I as Long, lngCount As Long
       m_rst.Open "select * from zb1"
       lngCount = m_rst.RecordCount
       If lngCount > 0 Then
          m_rst.MoveFirst
          For I = 0 To lngCount - 1 '循环取出m_rst的所有记录
             Debug.Print m_rst("OneFieldName") '输出字段名为“OneFieldName”值到立即窗口
             m_rst.MoveNext
          Next I
       End If
    End Sub
      

  26.   

    是的,但我现在又改变为用ADO对象,但datagrid控件中不能显示出所有记录,不知为何?请你们帮我指点,窗体和模块中的代码如下:(我只做了一个窗体和建立了一个模块)
    模块中的代码是:(我想在以后的窗体中随时调用这个模块中的函数)
    Public m_cnn As ADODB.Connection '数据连接对象
    Public m_rst As ADODB.Recordset '记录集
    Public Function exesql(ByVal sql As String) As ADODB.Connection
      Dim ssrr As String
      Set m_cnn = New ADODB.Connection
      Set m_rst = New ADODB.Recordset
      ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & App.Path & "\指标库.mdb"
      m_cnn.CursorLocation = adUseClient
      m_cnn.ConnectionString = ssrr
      m_cnn.Open
      Set m_rst.ActiveConnection = m_cnn
      m_rst.LockType = adLockOptimistic
      m_rst.CursorType = adOpenKeyset
      m_rst.Open sql
      Set exesql = m_rst
      Set m_rst = Nothing
      Set m_cnn = Nothing
    End Function
    窗体中的代码是:
    Private Sub cmd1_Click()
      Dim mrc As ADODB.Recordset
      Dim txtsql As String
      On Error Resume Next
      txtsql = "select * from zb1"
      Set mrc = exesql(txtsql)
      Set DataGrid1.DataSource = m_cnn
      DataGrid1.Visible = True
    End Sub
    private Sub Form_Load()
      DataGrid1.Visible = False
    End Sub
    向各位楼主讨教,谢谢帮助!
      

  27.   

    建议DataGrid的显示也用代码实现,而不是绑定记录集(尽可能多的将一切控制在自已的手中!)。
      

  28.   

    daisy8675(莫依) :
       你真是个“瓜妹子”,作为一个斑竹,今后一定要努力提高自己的专业素质,不要贻笑大方,误人子弟,切记。看来,XunBaian(蓝水晶)在数据库方面还是比你高明的多。
      

  29.   

    各位不要用VB6了!改用VB.NET吧! 
    各位不要用access了!改用sql2000 or oracle 吧! 
    .udl文件連數據庫就是老子說出來的,好用得不得了! 
    想知道: QQ--439609487
      

  30.   

    请yuan168(qq-489609487)你说话文明些好吗?
    这样才好进一步向你请教了!