使用普通软件安装后(路径任意选择)就可直接应用了,它们是怎样连接所对应的数据库的呢?
我的程序是用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文件来连接数据库,但没告诉具体方法。
请问各位楼主,最好连接数据库的方法是什么呢?还有更好的方法吗?谢谢你们能帮帮我!!!
我的程序是用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、从你使用的数据库来讲,你是使用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打包找不到,是你程序的问题,或者你查看打包过后的安装脚本目录,有问题修改过来就可以
我的程序和数据库在打包时已成为一个安装文件,在安装时只可能在一个目录下面,但比如我的程序编写时在D区,安装时在E区,程序在执行时仍错误提示“在D区的指定目录下找不到数据库”,不知为何,恳求你给我详细解答,万分感谢!
conn.ConnectionString = ssrr
conn.Open
改你的数据连接
//给编写有关系吗? 把你的access放进你编写的目录,安装时候自动会默认在安装跟目录下。
例如:
ConnectString1 = "Provider=SQLOLEDB.1;Data Source =" & "IP地址"_
& ";Initial Catalog=数据库名称;" _
& "User ID=sa;Password="
打包软件用“InstallShield ”这个软件非常好。可以用一下试试!!
每一种方法有它自己的应用,每一种方法都是可以,要看使用的环境,所以不是方法不好,是你的选择不好
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。
读配置文件是个不错的选择。
//在这个问题之前请先分请粗豪什么叫 access和sqlserver楼主要习惯结帖,偶查一的帖,几乎没结的。呵呵,提醒下。
odbc是什么?你清楚这个问题吗?access是什么,你又清楚这个问题吗?
odbc只是对sqlserver服务的,access只要用户机器上装office就使用的,完全不等同的类型。
看来你对SQL和Access什么区别最基本的知识都还不清楚。
有一天用户因为某些原因,认为Access数据库必须改变路径甚至改变文件时
//你随便让用户改变的你的数据库,除非这个用户是吃抱没事做,当然一种情况除外,也就是我说过datalinks的特殊情况,那就是全然不知道用户使用什么的情况,用户自己去选择喜欢的数据库使用datalink
ADO连接吧,就是你第二种啦,*.mdb放VB程序文件目录下下ssrr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False; Data Source=" & app.path & "\database\指标库.mdb"
conn.ConnectionString = ssrr
so大家眼光要开阔!学SQLSERVER吧 简单实际点
//你好象挺有经验的,留个联系方式讨教下吧 !
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
莫大小姐对ODBC的认识也太片面了吧
Open DataBase Connectivity(ODBC)
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
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
在程序中我用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
不知何故,请各位楼主指点,谢谢!
Dim m_cn As ADODB.Connection
再引用ADO对象啊!
引用“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
模块中的代码是:(我想在以后的窗体中随时调用这个模块中的函数)
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
向各位楼主讨教,谢谢帮助!
你真是个“瓜妹子”,作为一个斑竹,今后一定要努力提高自己的专业素质,不要贻笑大方,误人子弟,切记。看来,XunBaian(蓝水晶)在数据库方面还是比你高明的多。
各位不要用access了!改用sql2000 or oracle 吧!
.udl文件連數據庫就是老子說出來的,好用得不得了!
想知道: QQ--439609487
这样才好进一步向你请教了!