注册 登录
编程论坛 VB6论坛

关于VB操作数据库的问题,请高人解答一下

zhuluoliye 发布于 2013-08-14 16:24, 890 次点击
本人新人,初学VB,求高人指点一下,在操作数据库的时候遇到疑问


本人做一个登陆程序,
登录页面login.frm,跳转页面info.frm,info.frm中需要继续对数据库进行操作。
函数模块中有:打开数据库函数opencn(),关闭数据库函数clscn(),打开记录集openrs(),关闭记录集clsrs(),插入、更新、删除函数execsql()
我写的代码是这样的:
在login.frm中:opencn(),然后openrs()对用户名和密码进行核对,之后clsrs(),然后clscn(),unload login,show info.frm最后跳转到info.frm
跳转到info.frm后
在info.frm中:opencn(),接着openrs(),然后clsrs()进行信息的查询,然后execsql()进行数据库的插入或者删除操作,最后退出程序时clscn()。


我想搞明白的是,是不是我每查询一次就要关闭一次记录集,在一个需要操作数据库的页面都要先opencn(),unload时都要clscn()?跳转到另一个页面后都要先opencn(),unload时都要clscn()?
这些地方有些疑问,求人解答一下,谢谢了!!!
14 回复
#2
zhuluoliye2013-08-15 13:06
有没有人帮忙解答一下啊
#3
风吹过b2013-08-15 16:32
首先,一个程序里,一个数据库,只要使用全局对象,只打开一次,只关闭一次。
其次,记录集,需要每次查询都必须打开一个,用完就随手关闭。这个强烈不建议使用全局变量。
      使用 局部变量时,当你忘记关闭时,过程结束时,会自动关闭。

你这个程序结构应该是:
BAS 模块文件,定义
CONN ,
在 Main 函数中,调用 opencn() 连接好CONN 数据库连接来。
在显示 login.frm ,在 login.frm 只操作 记录集就是了,也就是只需要执行 openrs()。
    如果需要把记录集再提供给其他函数使用时,可以使用 按地址传递参数的方式进行调用。
每次验证结束后都需要执行 clsrs()

info.frm 也是同样,只需要执行 openrs()\execsql()\clsrs()

info.frm 退出时,表示程序也结束时,就再执行 clscn() 。
#4
zhuluoliye2013-08-16 08:38
首先很感谢您的解答,但是请恕我新手愚钝,对于main函数还不了解,能否给我详细解答一下,我把我做的一个示例上传,麻烦帮我改成使用main函数启动并加载数据库成不?我做的每次到数据查询、插入操作的时候总是反应很慢,麻烦帮我修改一下吧,谢谢了!
只有本站会员才能查看附件,请 登录
#5
zhuluoliye2013-08-16 08:38
回复 3楼 风吹过b
首先很感谢您的解答,但是请恕我新手愚钝,对于main函数还不了解,能否给我详细解答一下,我把我做的一个示例上传,麻烦帮我改成使用main函数启动并加载数据库成不?我做的每次到数据查询、插入操作的时候总是反应很慢,麻烦帮我修改一下吧,谢谢了!
只有本站会员才能查看附件,请 登录
#6
风吹过b2013-08-16 11:21
我现在没办法改这些程序里了。

在 WIN7 里,这个机子,不能装完全版的 VB6 ,很多东西都没办法看。
很多代码,我都是用记事本在看。
#7
zhuluoliye2013-08-16 13:30
回复 6楼 风吹过b
大哥,再一次感谢您的出现,可是您的回答有点让我失望,我在网上查了很久,都没有详细讲解main函数的用法的,我是真的很需要了解这方面的,对我操作数据库有很大的影响。我已经把所有的代码和界面上传,用记事本就能看,就再次麻烦您给我改一下吧,对我帮助很大的,谢谢了
只有本站会员才能查看附件,请 登录
#8
风吹过b2013-08-16 15:01
main 函数。
在工程属性里,选择启动 为 哪个窗口 或 MAIN 函数。

大工程,一般就建议使用 MAIN 函数启动
小工程,一般就建议 使用 Form1 启动。

这个函数,就是相当于 Form1_Load 过程。但这个函数执行时,可以不加载窗体就直接执行。
适合系统初始化需要处理事务需要。
#9
zhuluoliye2013-08-16 15:52
选择启动这个我知道,但是是不是每个窗口在加载事件中都要添加main()?
但我感觉每次使用execsql函数添加数据的时候都好慢,都要等上几秒钟,而且在执行execsql函数之前必须添加opencn()打开数据库,这个是什么问题?
#10
lowxiong2013-08-16 17:07
main函数只有一个,在模块里定义,你提供的代码我看了,函数写的很不科学。用函数和子程序的原则是1:功能单一,仅完成某一项功能即可 2:函数中不要使用全程变量,即使实际上使用了全程变量,也使用传值的方式单列开。我对你的程序修改后代码如下,我是用的sql2000,模拟你的资料,建了个usertable表,里面有个admin名和admin的记录,运行通过,代码如下:

'模块里代码
Public LoginSucceeded As Boolean        '登陆成功标记
Public conn As New ADODB.Connection

Public Function OpenCn(con As Connection) As Boolean       '连接数据库
  On Error Resume Next
  OpenCn = False
  If con.State = 1 Then
    '数据库连接已经打开,设置打开标志即退出,无需重复打开数据库
    OpenCn = True
    Exit Function
  End If
  con.ConnectionTimeout = 10
  SQL = "driver={sql server};server=(local);uid=sa;pwd=;Database=demo"
  con.ConnectionString = SQL
  con.Open
  If con.State = 1 Then OpenCn = True
End Function


Public Sub cloCn(con As Connection)     '关闭数据库
  On Error Resume Next
  If con.State <> adStateClosed Then con.Close
  Set con = Nothing
End Sub

Public Function openRs(ByVal strsql As String, rs As Recordset) As Boolean     '打开记录集
  On Error Resume Next
  openRs = False
  If rs.State = 1 Then rs.Close                                              '如果记录集是打开状态则先关闭
  With rs
    .ActiveConnection = conn
    .CursorLocation = adUseServer         '由于使用的是sql server,这里游标是adUseServer
    .CursorType = adOpenKeyset
    .LockType = adLockOptimistic
    .Open strsql
  End With
  If rs.State = 1 Then openRs = True
End Function

Public Sub cloRs(rs As Recordset)
  On Error Resume Next
  If rs.State <> adStateClosed Then rs.Close
  Set rs = Nothing
End Sub



'这是我写的main函数
Sub Main()
  If Not OpenCn(conn) Then
    MsgBox "数据库连接失败,请检查数据库", , "提示"
    End
  End If
  login.Show
End Sub

'login里代码,我没有写info代码,你自己琢磨下
Private Sub Command1_Click()
  Dim str As String, rs As New Recordset
  Dim str1 As String
  If Trim(Text1) = "" Or Trim(Text2) = "" Then
    MsgBox "用户名或密码不能为空", , "错误提示"
    Text1.SetFocus
  End If
  str = "select * from usertable where username='" & Trim(Text1) & "' and userpasswd='" & Trim(Text2) & "'"
  If Not openRs(str, rs) Then
    MsgBox "数据库记录不能打开,请检查数据库", , "错误提示"
    End
  End If
  If Not rs.EOF Then
    Info.Show
    cloRs rs
    Unload Me
  Else
    MsgBox "用户名或密码错误,请检查", , "错误提示"
    Text1.SetFocus
  End If
End Sub

只有本站会员才能查看附件,请 登录


#11
zhuluoliye2013-08-16 17:21
回复 10楼 lowxiong
非常感谢你的解答和修正,我先自己琢磨一下你修改的,然后领悟一下。

非常感谢了!!!
#12
zhuluoliye2013-08-16 17:30
回复 10楼 lowxiong
还有一个问题,就是每次插入数据或者修改数据的时候,总是有明显的滞后现象,不是点击添加按钮后就立马添加成功,感觉好慢,这个是什么原因?
#13
风吹过b2013-08-16 17:36
你执行修改数据会,是显示滞后的话,
那说明你显示部分没有 手动刷新。

如果你显示是绑定控件,刷新一下 数据源。
如果你是 手动显示数据,重新调用一下 显示数据的过程。

---
一般来说,小型数据,MDB ,数量不大的情况下,很快就可以得到结果。
如果是大型数据库,或者 数据服务器 很卡时,就会有明显的滞后情况。在这种情况下,只能优化一下数据库 或 更新数据服务器的硬件系统。
---
如果是添加时就很慢,那就需要检查你的数据库的设置。
#14
lowxiong2013-08-16 18:55
回复 12楼 zhuluoliye
你这不是要我做你第二个功能么?如果你数据库连接正确,代码简洁优化,那就一定是实时的。我曾经做的sql server同时带200个客户端,并且各客户端最远距离服务器超过30公里,登记数据都没有延迟现象,你是访问本地sql server,更不可能出现你说的情况,你检查下你的代码吧。只要思路清晰,就不会乱填代码,不要过份照搬别人的,要消化吸收才是自己的。

[ 本帖最后由 lowxiong 于 2013-8-16 18:56 编辑 ]
#15
zhuluoliye2013-08-16 20:21
回复 14楼 lowxiong
感谢您的细心知道,经过自己摸索,问题已经解决了,程序基本能正常运行,感谢大哥了哈,以后有不懂的还望帮忙解答一下哈
1