请高手指教,本工程是用ADO对象引用,Access2000为后台,里面主要有两个表,一个用户表,已经成功完成相关功能,如增加、删除、修改等,另外一个表为图书库,在连接该表时总是报告对象变量或WITH变量未设置。
代码如下:
Option Explicit
Dim addorSave As Boolean
Dim mrc As ADODB.Recordset
Public txtSQL As String
Dim adoCn As New ADODB.ConnectionPrivate Sub CboClass_Change()
Dim sSql As String
Dim MsgText As String
Dim mrcc As ADODB.Recordset
End SubPrivate Sub CboClass_KeyDown(KeyCode As Integer, Shift As Integer)
EnterToTab KeyCode
End SubPrivate Sub CmdCancel_Click()
Unload Me
End SubPrivate Sub Form_Load()
' Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
AdoBook.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
'adoCn.Open
addorSave = True
' AdoBook.Caption = "记录数:" & AdoBook.Recordset.AbsolutePosition + 1 & "/" & AdoBook.Recordset.RecordCount
Dim sSql As String
Dim intCount As Integer
Dim MsgText As String
Dim mrc As ADODB.Recordset
txtSQL = "select distinc 类别名称 from 图书类别表"
Set mrc = ExecuteSQL(txtSQL, MsgText)
If mrc.EOF Then
Do While Not mrc.EOF
CboClass.AddItem Trim(mrc.Fields(1))
mrc.MoveNext
Loop
CboClass.ListIndex = 0
Else
MsgBox "请先进行书籍标准设置!", vbOKOnly + vbExclamation, "警告"
CmdAddorOK.Enabled = False
Exit Sub
End If
mrc.Close
End Sub
代码如下:
Option Explicit
Dim addorSave As Boolean
Dim mrc As ADODB.Recordset
Public txtSQL As String
Dim adoCn As New ADODB.ConnectionPrivate Sub CboClass_Change()
Dim sSql As String
Dim MsgText As String
Dim mrcc As ADODB.Recordset
End SubPrivate Sub CboClass_KeyDown(KeyCode As Integer, Shift As Integer)
EnterToTab KeyCode
End SubPrivate Sub CmdCancel_Click()
Unload Me
End SubPrivate Sub Form_Load()
' Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
AdoBook.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
'adoCn.Open
addorSave = True
' AdoBook.Caption = "记录数:" & AdoBook.Recordset.AbsolutePosition + 1 & "/" & AdoBook.Recordset.RecordCount
Dim sSql As String
Dim intCount As Integer
Dim MsgText As String
Dim mrc As ADODB.Recordset
txtSQL = "select distinc 类别名称 from 图书类别表"
Set mrc = ExecuteSQL(txtSQL, MsgText)
If mrc.EOF Then
Do While Not mrc.EOF
CboClass.AddItem Trim(mrc.Fields(1))
mrc.MoveNext
Loop
CboClass.ListIndex = 0
Else
MsgBox "请先进行书籍标准设置!", vbOKOnly + vbExclamation, "警告"
CmdAddorOK.Enabled = False
Exit Sub
End If
mrc.Close
End Sub
应该可以的。
Do While Not mrc.EOF
CboClass.AddItem Trim(mrc.Fields(1))
mrc.MoveNext
Loop
CboClass.ListIndex = 0
Else
上面的代码: mrc.EOF表示没有记录,那下面怎么还执行呢
应改成
if not mrc.EOF then
(却定义了Dim adoCn As New ADODB.Connection)
dim AdoBook as Adodb.Connection
set adobool=new adodb.connection
你检查你用的对象Recordset,Connection等,使用前一定先new一下,我认为这种东西用的多最好定义是不要new而是用的时候在new(分配内存)否则如果太多会出现错误
定义Dim mrc As ADODB.Recordset
用的时候在:
set mrc=new ADODB.Recordset
set mrc=new adodb.recordset最好不要用Dim mrc as NEW ADODB.Recordset 这种方式来声明变量
还有逻辑错误住楼上的已经说了
这句话的返回结果应该是一个nothing ,请检查这个函数里面执行过程是不有错误产生.
在这句话执行后要先检查返回对象的状态再调用它。
Set mrc = ExecuteSQL(txtSQL, MsgText)
if not (mrc is nothing) then
if mrc.state=1 then
....
....
end if
end if
txtSQL = "select distinc 类别名称 from 图书类别表"
Set mrc = ExecuteSQL(txtSQL, MsgText)
If mrc.EOF Then
定义一个Recordset之后,必须要实例化,用Set mrc=new ADODB.Recordset或者Dim mrc As new ADODB.Recordset的方式也可以
Option Explicit
Public UID As String
Public PWD As String
Dim db As ADODB.Connection
Public Username As StringPublic Sub EnterToTab(Keyasc As Integer)
If Keyasc = 13 Then
SendKeys "{TAB}"
' SendKeys "{Home}+{End}"
End If
End Sub
Public Sub ShowErr()
MsgBox "" & vbCrLf & vbCrLf & Err.Description, vbOKOnly + vbCritical, ""
End Sub
'Public Sub EnterToTab(Keyasc As Integer)
' If Keyasc = 13 Then
' SendKeys "{TAB}"
' End If
'End SubPublic Function Testtxt(txt As String) As Boolean
If Trim(txt) = "" Then
Testtxt = False
Else
Testtxt = True
End If
End Function
Public Function ConnectString() _
As String
'returns a DB ConnectString
ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" _
& "\library.mdb" & ";Persist Security Info=False"
End FunctionPublic Function ExecuteSQL(ByVal SQL _
As String, MsgString As String) _
As ADODB.Recordset
'executes SQL and returns Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
'连接到指定的数据源类型
cnn.Open ConnectString
If InStr("INSERT,DELETE,UPDATE", _
UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & _
" query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, _
adOpenKeyset, _
adLockOptimistic
'rst.MoveLast 'get RecordCount
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & _
" 条记录 "
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误: " & _
Err.Description
Resume ExecuteSQL_Exit
End Function'Public Sub ConnectToDataBase()
Rem 把数据存到数据库文件中,利用SQL语句的INSERT表达式,其中要引用ADO2.5/3.0library 库
Rem On Error GoTo errhander:
'打开数据库
'引入ADO为了操作数据库
'Dim adoCn As New ADODB.Connection
'Dim adoRs As New ADODB.Recordset
'adoCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" _
& "\library.mdb" & ";Persist Security Info=False"
'adoCn.Open
'End Sub上面代码除了这函数外,还有两个目的:1窗体上各个文本框直接用回车键实现控件焦点的转移,无须手工点击每一个文本框;2,Testtxt函数是为了实现自动判断是否为空。但是实际上这两个功能都没有实现,而在别的程序里实现。请指教。谢谢!
或者你按F8单步执行,也可以发现在那儿产生了错误。
重点是看Set ExecuteSQL = rst这一句话有没有执行。
ps:看你的程序,我知道你是初学者,很多代码都是照搬过来的,对你提一些建议,不要只抄不看,不想,还有基本知识要掌握,比如对象,实例的概念,程序调试的基本方法,程序错误的分析等。从简到繁一步一步来。
Do While Not mrc.EOF
CboClass.AddItem Trim(mrc.Fields(1))
mrc.MoveNext ‘由于已经eof,无法movenext,当然出错!!!!!!!
Loop
。。
Do While Not mrc.EOF
CboClass.AddItem Trim(mrc.Fields(1))
mrc.MoveNext ‘(2)由于已经eof,无法movenext,当然出错!!!!!!!
Loop
。。
如果是select则创建一个记录集对象,并把查询结果返回到记录集中,并当做executesql函数的返回值;如果成功则返回记录数给msgstring,如果错误则把错误消息返回给msgstring.
这是MSDN上微软给的一个例子,功能很好,但你没有在函数执行后对其结果判断就直接当作其中一种情况的成功状态使用这是很不好的,至少你应该判断返回的msgstring的内容是什么,并用判断返回的对象的状态,再做相应的处理。
从楼主给出的错误提示上来说,不可能是mrc.movenext时产生的错误,因是那时是eof or bof为真,不能移动。还是如果eof为真,do while not mrc.eof 这个循环是不能执行的,更别说mrc.movenext这句话了.
不过也说明楼主又一个写错的地方:).hehe,看来这里的新手太多了,VB简单,但也是要认真学过才能和好的.