| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 570 人关注过本帖
标题:不能连续删除,删除第一个的时候可以,第二个就提示对象关闭时不允许操作
只看楼主 加入收藏
lz_xiaohai
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2017-3-2
结帖率:50%
  已结贴   问题点数:10  回复次数:7   
不能连续删除,删除第一个的时候可以,第二个就提示对象关闭时不允许操作
在模块里
Option Explicit
    Public cnn As New ADODB.Connection
    Public rs As New ADODB.Recordset
    Public cnnstr As String
    Public i As Integer
Public Function ExecuteSQL(ByVal sql As String) As ADODB.Recordset
   '**********************************************************
'功能:   执行后台SQL语句,
'参数:   SQL:SQL语句
'返回值: 如果是查询语句则返回记录集
'返回类型:记录集
'**********************************************************
    Dim cnn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    cnn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=itxrgw;Initial Catalog=db_SPJXC;Data Source=."
    rs.Open Trim(sql), cnn, adOpenKeyset, adLockOptimistic
    Set ExecuteSQL = rs
End Function

Public Sub main()            '定义一个公共主函数,用于连接数据库
    If cnn.state = adStateOpen Then
        cnn.Close
    Else
        cnn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=itxrgw;Initial Catalog=db_SPJXC"
    End If
End Sub
工具栏
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    Select Case Button.Key
    Case "add"   '添加
        tlbState Toolbar1, True
        Call MyAdd
    Case "del"    '删除
        Set rs = ExecuteSQL("select * from 经手人表 where 经手人编号='" & Text1(0).Text & "'")
        If rs.RecordCount > 0 Then
            Call main
            cnn.BeginTrans
            cnn.Execute ("Delete 经手人表 where 经手人编号='" & Text1(0).Text & "'")
            cnn.CommitTrans
            MsgBox "删除成功"
            Set rs = ExecuteSQL("select * from 经手人表")
            Set MSHFlexGrid1.DataSource = rs
        End If
    Case "save"   '保存
        Call main
        cnn.BeginTrans
        cnn.Execute ("insert into 经手人表 values('" & Text1(0).Text & "','" & Text1(1).Text & "','" & Text1(2).Text & "','" & Text1(3).Text & "','" & Text1(4).Text & "','" & Text1(5).Text & "')")
        cnn.CommitTrans
        MsgBox "保存成功"
        Set rs = ExecuteSQL("select * from 经手人表")
        Set MSHFlexGrid1.DataSource = rs

        MSHFlexGrid1.Refresh
        tlbState Toolbar1, False

    Case "cancel"  ' 取消
        tlbState Toolbar1, False
        Call MyClear
        MyFlag = False
'    Case "find"    ' 查询
'        Mystr = InputBox("请输入要查询的货品名称", "企业进销存管理系统", "J000001")
'        Adodc1.RecordSource = "select * from tb_in where in_numid ='" + Mystr + "'"
'        Adodc1.Refresh
'        Call JionBack
'        Adodc1.RecordSource = "select * from tb_in"
'        Adodc1.Refresh
'        MyFlag = False
    Case "close"   '关闭
        Unload Me
    End Select
End Sub
2017-12-28 10:12
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:24
帖 子:255
专家分:1404
注 册:2016-3-10
  得分:5 
问题出在这里
Public Sub main()            '定义一个公共主函数,用于连接数据库
    If cnn.state = adStateOpen Then
        cnn.Close
    Else
        cnn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=itxrgw;Initial Catalog=db_SPJXC"
    End If
End Sub
第一次调用,cnn没打开,则连接sql打开操作。
第二次调用,因为cnn已经打开,你就执行了关闭操作,因此后续sql没有目标了

可以这么修改,ExecuteSQL结束语句中增加关闭操作。
2017-12-28 14:22
lz_xiaohai
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2017-3-2
  得分:0 
你好,我是新手,为什么有时候提示对象打开时不允许操作,有时提示对象关闭时不允许操作,版主能给讲一下嘛,谢谢。。。。

我在cnn.close前面加一个rs.close set rs=nothing 就提示对象关闭时不允许操作

[此贴子已经被作者于2017-12-28 15:11编辑过]

2017-12-28 15:02
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:24
帖 子:255
专家分:1404
注 册:2016-3-10
  得分:0 
我一般都是这么操作。
设置公共变量connstr,sqlstr
每次调用先赋值(不管是删除、编辑、增加)
 ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Cur_Dir & "\film.mdb"
 SqlStr = "select * from film where 片名='" & name1 & "'"
接着执行打开
  cn.Open ConnStr
  rs.Open SqlStr, cn, 1, 1'查询,改为 rs.Open SqlStr, cn, 1, 3增加更新
  '其他语句
之后执行关闭   
  rs.Close
  cn.Close
这样能保证多次调用前,数据库都是关闭的,连状态都不用判断。
除非你的查询非常多,可以考虑打开一次多次查询,简单的以上做法不容易出错。
另外connstr连接串相当于打开驱动,sqlstr相当于打开查询,是两个事件。
打开时先打开connstr,之后才能打开sqlstr;否则会报错,每个事件打开后再打开就会报错。
关闭时先关闭sqlstr,后关闭connstr,每个事件关闭后在关闭也会报错。


[此贴子已经被作者于2017-12-28 16:24编辑过]

2017-12-28 16:10
lz_xiaohai
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2017-3-2
  得分:0 
谢谢,受教了。。。。
2017-12-28 16:34
lz_xiaohai
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2017-3-2
  得分:0 
cnn.Execute ("Update 经手人表 set 经手人姓名='" & Trim(Text1(1).Text) & "' , 联系方式='" & Trim(Text1(2).Text) & "',联系地址='" & Trim(Text1(3).Text) & "' ,身份证号='" & Trim(Text1(4).Text) & "' ,备注='" & Trim(Text1(5).Text) & "' where 经手人编号='" & Text1(0).Text & "'")

版主你好,请教一下长代码如何换行,比如上面的代码我任找一个&  在后面加空格加下划线回车就可以,如果在逗号后面同样加空格加下划线回车就不可以,这是为什么,这个下划线放在哪儿有什么讲究吗。
2017-12-29 13:04
lz_xiaohai
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2017-3-2
  得分:0 
哦,知道了,就是字符串内不能使用下划线换行。
2017-12-29 14:27
ZHRXJR
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:71
帖 子:738
专家分:3955
注 册:2016-5-10
  得分:5 
其实你的 main()可以修改成这样:
Public Sub main(cnn)            '定义一个公共过程,用于连接数据库
    cnn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=itxrgw;Initial Catalog=db_SPJXC"
End Sub
使用数据库可以 Call main(cnn),使用结束后使用 cnn.Close 语句关闭数据库连接就可以了。
例如你的
    Case "del"    '删除
        Set rs = ExecuteSQL("select * from 经手人表 where 经手人编号='" & Text1(0).Text & "'")
        If rs.RecordCount > 0 Then
            Call main(cnn)
            cnn.BeginTrans
            cnn.Execute ("Delete 经手人表 where 经手人编号='" & Text1(0).Text & "'")
            cnn.CommitTrans
            MsgBox "删除成功"
            Set rs = ExecuteSQL("select * from 经手人表")
            Set MSHFlexGrid1.DataSource = rs
            cnn.Close
        End If
不是特别简单吗?
2017-12-31 13:48







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023945 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved