为什么?!又调试了半天还是不行啊!

时间:2021-11-02 00:16:45
vb+sql server,ado方式

数据库中有两个表,guest和temp,两表的格式完全相同。guest表中有内容。temp为空。
用recordset得到guest的recordcount没有问题。
但是我用
   TempSql = "select * from temp "   '查看temp表是否为空
   Set TempRs = OpenRec(TempSql)
   If TempRs.RecordCount <> 0 Then  '错误提示在这里
      MsgBox "temp表不为空"
   end if
  
    可是,程序提示 实时错误 3704 ,如果对象已关闭,则不允许执行应用程序所要求的操作。
   为什么?它好像不让我用temp表的recordcount,可是temp表我也没有设置什么啊。它和guest表一样,只是一个有内容而一个无内容啊。
为什么?各位大侠帮忙。谢谢!100分相送,在线等待。


28 个解决方案

#1


看看你的代码中有没有类似rs.close之类的代码!

如果有的话将此语句删除,然后再试!

#2


有rs.close的。但都是针对guest表的。rs也是对guest记录集的。而且rs.close后,立刻有rs.open。为什么?

#3


dim rs as adodb.recordset
dim con as adodb.connection
试试
TempSql = "select * from temp "   '查看temp表是否为空
set con=new adodb.connection
con.connectionstring=""
con.open
rs.open TempSql,con,3,3
if rs.recordcount<>0 then
   msgbox "not data"
end if 

#4


楼上大侠,我照你那么写,提示错误:[microsoft][odbc 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序。

再次请教!

#5


If rs.state = 0 Then
   MsgBox "没有记录", vbOKOnly, "提示"
Exit Sub
End If

#6


问题就在于你的自定义函数OpenRec

我猜你这个函数大概这样子吧(乱猜的,也只能这样子猜,猜得不好莫怪啊)
Public Function OpenRec(ByVal strSqlStmt As String) As ADODB.RecordSet
    rs.Source = strSqlStmt
    rs.Open
    Set OpenRec = rs
    rs.Close
End Function

Set TempRs = OpenRec(TempSql)

如果你这个函数大概真是这样子的话,不出错才怪呢。
TempRs 和 rs 同引用一个记录集,
在函数返回前这个记录集已经被关闭了。
所以也就出错啰。

#7


把这句If TempRs.RecordCount <> 0 Then换成
if temprs.eof and temprs.bof then

#8


建议把OpenRec函数的定义代码Copy上来。

#9


我的函数是

 Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
Dim Tmprec As New ADODB.Recordset
On Error Resume Next
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function


这个函数应该没有问题。

#10


up

#11


1  TempSql = "select * from temp "   '查看temp表是否为空
2  Set TempRs = OpenRec(TempSql)
3  If TempRs.RecordCount <> 0 Then  '错误提示在这里
4     MsgBox "temp表不为空"
5  end if

事实就是
在2行位置,返回的记录录是已经关闭了的。所以3行位置访问属性RecordCount报错。

#12


引用:sanpo(山炮) ---------------
把这句If TempRs.RecordCount <> 0 Then换成
if temprs.eof and temprs.bof then

---------------------------
还是出现第一个错误

#13


Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
    Dim Tmprec As New ADODB.Recordset
    On Error Resume Next
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function
看了你这个函数,也觉得没有什么不对啊。
但是对于Tmprec这个变量倒是觉得又有点儿问题。
你又在这个函数中返回这个局部变量...

建立这样做
Public Syb OpenRec(ByVal strSql As String, Rec As ADODB.Recordset)
    ...
    Rec.Open
End Function

#14


当然了
访问一个关闭了的记录集的属性(RecordCount, Eof, Bof, ...)是没有意义的。

#15


Intelement(智能元素) ,你说返回的记录录是已经关闭了的。怎么会呢?
我的函数已经写了。你能帮我看看吗?

guest表的打开,也是用OpneRec的。它的recordset的recordcount都可以正确运用。为什么?

OpenRec是在另一个模块中的公用函数。

#16


OpenRec没问题!别的表都是用它打开的。

#17


其实我也觉得没有问题。
是因为在C/C++是对象引用都没有计数的。所以在C/C++一定不能返回局部变量。(有点跑题了)

Debug.Print TempRs.State '看看是否为1

adStateOpen   1
adStateClosed 0

#18


Debug.Print TempRs.State

看看其值是否为1

adStateOpen   1
adStateClosed 0

#19


Intelement(智能元素)兄 ,Debug.Print TempRs.State为0

奇怪了。它是关闭了,但~~但~~但~~为什么~~~~~~~~~~~~~~~~~~~~~~``

#20


Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
    Dim Tmprec As New ADODB.Recordset
    'On Error Resume Next   '把这一句注释掉,看看究竟什么了什么错误。
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function

会不会是 select * from temp 有错啊

噢!对了
在SQL SERVER 中,TEMP 是关键字!!!

这样写SQL语句
TempSql = "select * from [temp]"
Set TempRs = OpenRec(TempSql)

#21


由于在SQL SERVER中TEMP是关键字。
所以SELECT * FROM TEMP出现语法错误。
OPEN记录集的时候肯定出错啦。
但是你在函数里面启动了错误陷阱
且用的是On Error Resume Next
所以...

#22


上面只是初步猜测。

'On Error Resume Next   '最好把这一句注释掉,看看究竟什么了什么错误!!!!

吃饭去,待会儿再来。

#23


Intelement(智能元素) ,是的。问题解决了一大半了!
还有一些错误,但要谢谢你!等我把问题都解决了之后,给你分!
我也刚吃完饭来!

#24


to be continue...

#25


Intelement(智能元素) 兄,还有一个问题需要请教
如果我要删除一个表的总体内容,该怎么办?
我用的是   
      If TempRs2.RecordCount <> 0 Then
            TempRs2.MoveFirst             'temp2清空
            For i = 1 To TempRs2.RecordCount
                TempRs2.Delete
                TempRs2.MoveNext   ’错误在这里
            Next i
        End If

     程序报错。如果改成——

   If TempRs2.RecordCount <> 0 Then
            TempRs2.MoveFirst             'temp2清空
            For i = 1 To TempRs2.RecordCount
                TempRs2.Delete   '错误在这里
                TempRs2.Update
                TempRs2.Close
                TempRs2.Open
              Next i
        End If

而以上两个错误都不是很稳定,请求帮助。
删除表的所有内容和删除表中的一个记录程序上有啥区别呢?(除了for循环之外)

#26


试试结帐后还能不能“发炎”

#27


啊?
结贴了还能“发炎”

#28


Intelement(智能元素) 兄,我从起了个帖子,能帮帮我吗?在那上面回复吧!

#1


看看你的代码中有没有类似rs.close之类的代码!

如果有的话将此语句删除,然后再试!

#2


有rs.close的。但都是针对guest表的。rs也是对guest记录集的。而且rs.close后,立刻有rs.open。为什么?

#3


dim rs as adodb.recordset
dim con as adodb.connection
试试
TempSql = "select * from temp "   '查看temp表是否为空
set con=new adodb.connection
con.connectionstring=""
con.open
rs.open TempSql,con,3,3
if rs.recordcount<>0 then
   msgbox "not data"
end if 

#4


楼上大侠,我照你那么写,提示错误:[microsoft][odbc 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序。

再次请教!

#5


If rs.state = 0 Then
   MsgBox "没有记录", vbOKOnly, "提示"
Exit Sub
End If

#6


问题就在于你的自定义函数OpenRec

我猜你这个函数大概这样子吧(乱猜的,也只能这样子猜,猜得不好莫怪啊)
Public Function OpenRec(ByVal strSqlStmt As String) As ADODB.RecordSet
    rs.Source = strSqlStmt
    rs.Open
    Set OpenRec = rs
    rs.Close
End Function

Set TempRs = OpenRec(TempSql)

如果你这个函数大概真是这样子的话,不出错才怪呢。
TempRs 和 rs 同引用一个记录集,
在函数返回前这个记录集已经被关闭了。
所以也就出错啰。

#7


把这句If TempRs.RecordCount <> 0 Then换成
if temprs.eof and temprs.bof then

#8


建议把OpenRec函数的定义代码Copy上来。

#9


我的函数是

 Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
Dim Tmprec As New ADODB.Recordset
On Error Resume Next
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function


这个函数应该没有问题。

#10


up

#11


1  TempSql = "select * from temp "   '查看temp表是否为空
2  Set TempRs = OpenRec(TempSql)
3  If TempRs.RecordCount <> 0 Then  '错误提示在这里
4     MsgBox "temp表不为空"
5  end if

事实就是
在2行位置,返回的记录录是已经关闭了的。所以3行位置访问属性RecordCount报错。

#12


引用:sanpo(山炮) ---------------
把这句If TempRs.RecordCount <> 0 Then换成
if temprs.eof and temprs.bof then

---------------------------
还是出现第一个错误

#13


Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
    Dim Tmprec As New ADODB.Recordset
    On Error Resume Next
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function
看了你这个函数,也觉得没有什么不对啊。
但是对于Tmprec这个变量倒是觉得又有点儿问题。
你又在这个函数中返回这个局部变量...

建立这样做
Public Syb OpenRec(ByVal strSql As String, Rec As ADODB.Recordset)
    ...
    Rec.Open
End Function

#14


当然了
访问一个关闭了的记录集的属性(RecordCount, Eof, Bof, ...)是没有意义的。

#15


Intelement(智能元素) ,你说返回的记录录是已经关闭了的。怎么会呢?
我的函数已经写了。你能帮我看看吗?

guest表的打开,也是用OpneRec的。它的recordset的recordcount都可以正确运用。为什么?

OpenRec是在另一个模块中的公用函数。

#16


OpenRec没问题!别的表都是用它打开的。

#17


其实我也觉得没有问题。
是因为在C/C++是对象引用都没有计数的。所以在C/C++一定不能返回局部变量。(有点跑题了)

Debug.Print TempRs.State '看看是否为1

adStateOpen   1
adStateClosed 0

#18


Debug.Print TempRs.State

看看其值是否为1

adStateOpen   1
adStateClosed 0

#19


Intelement(智能元素)兄 ,Debug.Print TempRs.State为0

奇怪了。它是关闭了,但~~但~~但~~为什么~~~~~~~~~~~~~~~~~~~~~~``

#20


Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
    Dim Tmprec As New ADODB.Recordset
    'On Error Resume Next   '把这一句注释掉,看看究竟什么了什么错误。
    Tmprec.Open strSql, Adocn, 3, 3
    Set OpenRec = Tmprec
End Function

会不会是 select * from temp 有错啊

噢!对了
在SQL SERVER 中,TEMP 是关键字!!!

这样写SQL语句
TempSql = "select * from [temp]"
Set TempRs = OpenRec(TempSql)

#21


由于在SQL SERVER中TEMP是关键字。
所以SELECT * FROM TEMP出现语法错误。
OPEN记录集的时候肯定出错啦。
但是你在函数里面启动了错误陷阱
且用的是On Error Resume Next
所以...

#22


上面只是初步猜测。

'On Error Resume Next   '最好把这一句注释掉,看看究竟什么了什么错误!!!!

吃饭去,待会儿再来。

#23


Intelement(智能元素) ,是的。问题解决了一大半了!
还有一些错误,但要谢谢你!等我把问题都解决了之后,给你分!
我也刚吃完饭来!

#24


to be continue...

#25


Intelement(智能元素) 兄,还有一个问题需要请教
如果我要删除一个表的总体内容,该怎么办?
我用的是   
      If TempRs2.RecordCount <> 0 Then
            TempRs2.MoveFirst             'temp2清空
            For i = 1 To TempRs2.RecordCount
                TempRs2.Delete
                TempRs2.MoveNext   ’错误在这里
            Next i
        End If

     程序报错。如果改成——

   If TempRs2.RecordCount <> 0 Then
            TempRs2.MoveFirst             'temp2清空
            For i = 1 To TempRs2.RecordCount
                TempRs2.Delete   '错误在这里
                TempRs2.Update
                TempRs2.Close
                TempRs2.Open
              Next i
        End If

而以上两个错误都不是很稳定,请求帮助。
删除表的所有内容和删除表中的一个记录程序上有啥区别呢?(除了for循环之外)

#26


试试结帐后还能不能“发炎”

#27


啊?
结贴了还能“发炎”

#28


Intelement(智能元素) 兄,我从起了个帖子,能帮帮我吗?在那上面回复吧!