对象变量或 With 块变量没有设置(错误 91) 创建对象变量有两个步骤。第一,必须先声明对象变量。然后必须用 Set 语句将一个正确的引用赋值给对象变量。同样地,With...End With 块必须先用 With 语句进入点来执行初始化。此错误有以下的原因和解决方法: 试图使用的对象变量,还没有用一个正确对象的引用来赋值。 给对象变量指定或再指定一个引用。例如,如果在下列的代码中省略 Set 语句的话,那么引用 MyObject 将会产生错误:Dim MyObject As Object ' 创建对象变量。 Set MyObject = Sheets(1) ' 创建一个正确的对象引用。 MyCount = MyObject.Count ' 计数值赋给 MyCount。试图用的对象变量已经被设为 Nothing。 Set MyObject = Nothing ' 释放此对象。 MyCount = MyObject.Count ' 引用了已释放的对象。再指定引用给对象变量。例如,使用新的 Set 语句给对象设置新的引用。此对象是正确的对象,但没有被设置,因为在对象库中,在 “引用” 对话框中没有被选取。 在 “添加引用” 对话框选择对象库。在 With 块内GoTo 语句的去向。 不要跳进 With 块。确保块使用 With 语句进入点以执行初始化。当选了 “设置下一条语句” 命令时,在 With 块内指定了一行。 With 块必须用 With 语句执行初始化。详细信息,可选取有问题的项目,并按下 F1 键。
'首先打开记录集( command1_click() ) ' locktype 为 adlockpessimistic '再次显示在Msflexgrid 中( command2_click() ) '接着测试 ( command4_click() ) '里面有修改,有添加,测试都可以 '本来锁类型为adlockpessimistic 意味着不许修改,添加,这是为什么????? '在一台机子上我运行了command1_click() '在另外的机子上我进行测试 '而在同一台机子上结果也是如此。 Why …… :(~~~~~~~~~~~~~~~~ '另外,Recordcount 在何种条件下不能用? MSDN 上说 cursortype -->adopenforwardoly不能用 '但在cursorlocation 为aduseServer 时 都用不了,而在aduseclient 时都可用。是MSDN 有问题?还是………… 'locktype,cursortype ,cursorlocation到底如何搭配使用???? '渴求高手帮助!!!!!! Dim adocn As New adodb.Connection Dim adocm As New adodb.Command Dim adoRs As New adodb.Recordset Private Sub Command1_Click() Dim errLoop As adodb.Error adocn.Errors.Clear Dim sql As String sql = "select * from TB001" If adoRs.State = 1 Then adoRs.Close End If adoRs.CursorType = adOpenDynamic adoRs.CursorLocation = adUseServer adoRs.LockType = adLockPessimistic adoRs.Open sql, adocn, , , adCmdText Debug.Print adoRs.RecordCount On Error GoTo Err_Execute Err_Execute: ' 将任何由执行查询引起的错误通知用户。 If adocn.Errors.Count > 0 Then For Each errLoop In adocn.Errors MsgBox "Error number: " & errLoop.Number & vbCr & _ errLoop.Description Next errLoop End If
Resume Next End Sub Private Sub Command2_Click() Dim StrItem As String Dim i, j As Integer
Grid.Cols = adoRs.Fields.Count + 1 Grid.Rows = 1 Grid.Rows = 3 Grid.Redraw = False Grid.Row = 0 Grid.Col = 0 Grid.Text = "序号" For j = 0 To adoRs.Fields.Count - 1 Grid.Col = j + 1 Grid.Text = adoRs.Fields(j).Name Debug.Print adoRs.Fields(j).Type Next j adoRs.MoveFirst While Not adoRs.EOF ' For i = 1 To adoRs.RecordCount ' StrItem = Str(i) For j = 0 To adoRs.Fields.Count - 1 StrItem = StrItem & vbTab & adoRs.Fields(j) Next j Grid.AddItem StrItem, Grid.Rows - 2 adoRs.MoveNext ' Next i Wend Grid.Redraw = True Grid.Refresh
End SubPrivate Sub Command3_Click() Dim sql As String Dim errLoop As adodb.Error adocn.Errors.Clear sql = "update TB001 set T00101='jack'" adocn.Execute (sql) Err_Execute: ' 将任何由执行查询引起的错误通知用户。 If adocn.Errors.Count > 0 Then For Each errLoop In adocn.Errors MsgBox "Error number: " & errLoop.Number & vbCr & _ errLoop.Description Next errLoop End If
Resume NextEnd SubPrivate Sub Command4_Click() Dim sql As String Dim errLoop As adodb.Error Dim rs As New adodb.Recordset On Error GoTo Err_Execute adocn.Errors.Clear If rs.State Then rs.Close End If rs.LockType = adLockPessimistic rs.CursorLocation = adUseServer rs.CursorType = adOpenKeyset rs.Open "select * from TB001", adocn, , , adCmdText rs.MoveFirst
' 修改 Do While Not rs.EOF If rs.Fields(0) = "hqh" Then rs.Fields(1) = "999" End If rs.MoveNext Loop '添加 rs.AddNew rs.Fields(0) = "kmx" rs.Fields(1) = 77 rs.Fields(2) = 201 rs.Update
Err_Execute: ' 将任何由执行查询引起的错误通知用户。 If adocn.Errors.Count > 0 Then For Each errLoop In adocn.Errors MsgBox "Error number: " & errLoop.Number & vbCr & _ errLoop.Description Next errLoop End If
' Resume NextEnd SubPrivate Sub Form_Load() adocn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=rberp;Data Source=rberp" adocn.Open If adocn.State = 0 Then MsgBox "Connect database error!", vbCritical, "Hello!" Exit Sub ' Else ' MsgBox "connect database success!", vbInformation, "" End If' Call AddTvItem End Sub 回复贴子: 回复人: Wesely(无奈太多) (2001-11-12 16:35:15) 得0分 关注! 回复人: luckyhqh(luckyhqh) (2001-11-12 17:39:41) 得0分 help.......
adoMainData是个什么? ado控件? 那么用 Dim c As ADODB.Connection Set c = New ADODB.Connection Set c = Adodc1.Recordset.ActiveConnection c.Execute "INSERT INTO [a] VALUES ('asd')" c.Close Set c = Nothing
我写一段给你参考一下 set rs as new adodb.recordset rs.open "table",conn,adOpenKeyset,adLockOptimistic rs.addnew rs.update
这个没有问题,还有什么??:zymfy(梦小凡)
对就是这个错误,怎么解决,谢谢:platinumkill(bb)
我查过的,不明白怎么做,请指教!!
adoMainData.Recordset.AddNew
它出的问题
ado.cursortype
是什么?
ado.cursorlocation=3
ado.cursortype=1
:wjying(葡萄)
ado.cursorlocation=3
ado.cursortype=1
麻烦告诉我对应的常量名是什么
CursorType = adOpenKeyset
cursorlocation=aduseclient
adoMainData.Recordset.Update
不行
那也谢谢了
我只加了个控件,什么都没有做??
连上数据库就不好使??为什么???
有,我是用控件的,连接没有问题
创建对象变量有两个步骤。第一,必须先声明对象变量。然后必须用 Set 语句将一个正确的引用赋值给对象变量。同样地,With...End With 块必须先用 With 语句进入点来执行初始化。此错误有以下的原因和解决方法: 试图使用的对象变量,还没有用一个正确对象的引用来赋值。
给对象变量指定或再指定一个引用。例如,如果在下列的代码中省略 Set 语句的话,那么引用 MyObject 将会产生错误:Dim MyObject As Object ' 创建对象变量。
Set MyObject = Sheets(1) ' 创建一个正确的对象引用。
MyCount = MyObject.Count ' 计数值赋给 MyCount。试图用的对象变量已经被设为 Nothing。
Set MyObject = Nothing ' 释放此对象。
MyCount = MyObject.Count ' 引用了已释放的对象。再指定引用给对象变量。例如,使用新的 Set 语句给对象设置新的引用。此对象是正确的对象,但没有被设置,因为在对象库中,在 “引用” 对话框中没有被选取。
在 “添加引用” 对话框选择对象库。在 With 块内GoTo 语句的去向。
不要跳进 With 块。确保块使用 With 语句进入点以执行初始化。当选了 “设置下一条语句” 命令时,在 With 块内指定了一行。
With 块必须用 With 语句执行初始化。详细信息,可选取有问题的项目,并按下 F1 键。
adoMainData.Recordset.Fields("dw").Value = dcoDlmDw.Text
adoMainData.Recordset.Update可能你的 adomaindata没打开
你的代码太少了,分析不了
to all:
其实这些我看应该是ado 属性的关键的地方
欢迎大家讨论一下,欢迎高手指点我们这些菜鸟。
下面是我的以前提过的问题,还没有一个明确的答案。
主 题:恳求帮助:ado锁问题(locktype),locktype 为 adlockpessimistic,但却可以添加,修改,另外,Recordcount 在何种条件下不能用? MSDN 上说 cursortype -->adopenforwardoly不能用
作 者:luckyhqh
所属论坛:数据库开发
问题点数:25
回复次数:14
发表时间:2001-11-12 16:11:44
'首先打开记录集( command1_click() )
' locktype 为 adlockpessimistic
'再次显示在Msflexgrid 中( command2_click() )
'接着测试 ( command4_click() )
'里面有修改,有添加,测试都可以
'本来锁类型为adlockpessimistic 意味着不许修改,添加,这是为什么?????
'在一台机子上我运行了command1_click()
'在另外的机子上我进行测试
'而在同一台机子上结果也是如此。 Why …… :(~~~~~~~~~~~~~~~~
'另外,Recordcount 在何种条件下不能用? MSDN 上说 cursortype -->adopenforwardoly不能用
'但在cursorlocation 为aduseServer 时 都用不了,而在aduseclient 时都可用。是MSDN 有问题?还是…………
'locktype,cursortype ,cursorlocation到底如何搭配使用????
'渴求高手帮助!!!!!!
Dim adocn As New adodb.Connection
Dim adocm As New adodb.Command
Dim adoRs As New adodb.Recordset
Private Sub Command1_Click()
Dim errLoop As adodb.Error
adocn.Errors.Clear
Dim sql As String
sql = "select * from TB001"
If adoRs.State = 1 Then
adoRs.Close
End If
adoRs.CursorType = adOpenDynamic
adoRs.CursorLocation = adUseServer
adoRs.LockType = adLockPessimistic
adoRs.Open sql, adocn, , , adCmdText
Debug.Print adoRs.RecordCount
On Error GoTo Err_Execute
Err_Execute:
' 将任何由执行查询引起的错误通知用户。
If adocn.Errors.Count > 0 Then
For Each errLoop In adocn.Errors
MsgBox "Error number: " & errLoop.Number & vbCr & _
errLoop.Description
Next errLoop
End If
Resume Next
End Sub
Private Sub Command2_Click()
Dim StrItem As String
Dim i, j As Integer
Grid.Cols = adoRs.Fields.Count + 1
Grid.Rows = 1
Grid.Rows = 3
Grid.Redraw = False
Grid.Row = 0
Grid.Col = 0
Grid.Text = "序号"
For j = 0 To adoRs.Fields.Count - 1
Grid.Col = j + 1
Grid.Text = adoRs.Fields(j).Name
Debug.Print adoRs.Fields(j).Type
Next j
adoRs.MoveFirst
While Not adoRs.EOF
' For i = 1 To adoRs.RecordCount
'
StrItem = Str(i)
For j = 0 To adoRs.Fields.Count - 1
StrItem = StrItem & vbTab & adoRs.Fields(j)
Next j
Grid.AddItem StrItem, Grid.Rows - 2
adoRs.MoveNext
' Next i
Wend
Grid.Redraw = True
Grid.Refresh
End SubPrivate Sub Command3_Click()
Dim sql As String
Dim errLoop As adodb.Error
adocn.Errors.Clear sql = "update TB001 set T00101='jack'"
adocn.Execute (sql)
Err_Execute: ' 将任何由执行查询引起的错误通知用户。
If adocn.Errors.Count > 0 Then
For Each errLoop In adocn.Errors
MsgBox "Error number: " & errLoop.Number & vbCr & _
errLoop.Description
Next errLoop
End If
Resume NextEnd SubPrivate Sub Command4_Click()
Dim sql As String
Dim errLoop As adodb.Error
Dim rs As New adodb.Recordset
On Error GoTo Err_Execute
adocn.Errors.Clear
If rs.State Then
rs.Close
End If
rs.LockType = adLockPessimistic
rs.CursorLocation = adUseServer
rs.CursorType = adOpenKeyset
rs.Open "select * from TB001", adocn, , , adCmdText
rs.MoveFirst
' 修改
Do While Not rs.EOF
If rs.Fields(0) = "hqh" Then
rs.Fields(1) = "999"
End If
rs.MoveNext
Loop
'添加
rs.AddNew
rs.Fields(0) = "kmx"
rs.Fields(1) = 77
rs.Fields(2) = 201
rs.Update
Err_Execute: ' 将任何由执行查询引起的错误通知用户。
If adocn.Errors.Count > 0 Then
For Each errLoop In adocn.Errors
MsgBox "Error number: " & errLoop.Number & vbCr & _
errLoop.Description
Next errLoop
End If
' Resume NextEnd SubPrivate Sub Form_Load() adocn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=rberp;Data Source=rberp"
adocn.Open
If adocn.State = 0 Then
MsgBox "Connect database error!", vbCritical, "Hello!"
Exit Sub
' Else
' MsgBox "connect database success!", vbInformation, ""
End If' Call AddTvItem
End Sub
回复贴子:
回复人: Wesely(无奈太多) (2001-11-12 16:35:15) 得0分
关注!
回复人: luckyhqh(luckyhqh) (2001-11-12 17:39:41) 得0分
help.......
回复人: luckyhqh(luckyhqh) (2001-11-13 15:06:48) 得0分
~~~~~~~~~~~~~~~~恳求帮助~~~~~~~~~~~~~~~~~~
回复人: luckyhqh(luckyhqh) (2001-11-27 9:26:29) 得0分
%$(*)(__)(*&^^%^*(*)
回复人: uje(sky) (2001-11-27 9:47:53) 得0分
你用的是什么数据库,锁定功能是有数据库厂商提供的。而LOCKTYPE是ADO中定义的,有的PROVIDER不支持所有的类型。
回复人: uje(sky) (2001-11-27 9:47:57) 得0分
你用的是什么数据库,锁定功能是有数据库厂商提供的。而LOCKTYPE是ADO中定义的,有的PROVIDER不支持所有的类型。
回复人: luckyhqh(luckyhqh) (2001-11-27 11:41:44) 得0分
我用的时MS sqlserver 7.0 2000, msdn 何ms sqlserver online book 看的比较多,但是都没有一个好的说法。 :(
回复人: diruser(求知) (2001-11-27 11:50:36) 得0分
求记录总数,请用select count(*) from 表名,然后读出记录值。
若用记录集要先移到最后一笔,才可。
回复人: diruser(求知) (2001-11-27 11:54:01) 得0分
1。adlockpessimistic-- 保守式记录锁定(逐条)。
2。adLockReadOnly--只读,无法更改数据。
3。adLockOptimistic--开放式记录锁定。
4。adLockBatchOptimistic--开放式批更新
只用2.的为只读,无法更改数据.
回复人: bisc_sunny(中子) (2001-11-27 12:48:36) 得0分
谁说的adlockpessimistic是只读游标阿!只有AdlockReadOnly才是只读的,
其他全都是可读可写,只不过锁的机制不同,diruser已经说得很清楚了。关于RecordCount,请先使用Rs.MoveLast,这一点MSDN里也说过。
然而服务器端游标确实使用起来有诸多限制,而且除了打开速度外,浏览时并不感觉快。
回复人: luckyhqh(luckyhqh) (2001-11-27 16:33:14) 得0分
adlockpessimistic -- 保守式记录锁定,当然,打开的地方可以用来读写,我指的是如别人同时也打开的话,那就会有锁定而别人只读。如果不是这样,如何控制只能让一个用户修改,而其修改释放后,别的人立即可以修改,这如何达到,能否有段代码。谢谢!
回复人: bluepower2008(蓝色力量) (2001-11-27 18:31:10) 得0分
看来兄弟你有必要去看看数据库的锁类型和模式。
看看有关共享锁,更新锁,排他锁和意向锁。
当一个用户在读取记录时,使用的是共享锁,这时其他用户也只能对同样的记录申请共享锁。如果用户要修改记录,就要申请排他锁,这时该资源上不能有其他任何锁。但为了防止死锁,可以先使用更新锁,在修改时再升级到排他锁,对于一个资源同一时间只能一个事务拥有更新锁。
其他还有很多关于锁的知识,现在要走了,下次有时间再写吧。
建议你自己看看书,琢磨琢磨,收获会更大。
回复人: luckyhqh(luckyhqh) (2001-11-28 9:49:06) 得0分
bluepower2008(蓝色力量) :
能否给段源代码?在Sql server 2000的联机帮助上确实有这些东西,但我从头看到尾由于没有代码,我还是很朦胧.
ado控件?
那么用
Dim c As ADODB.Connection
Set c = New ADODB.Connection
Set c = Adodc1.Recordset.ActiveConnection
c.Execute "INSERT INTO [a] VALUES ('asd')"
c.Close
Set c = Nothing
rs.open "table",conn,adOpenKeyset,adLockOptimistic
rs.addnew
rs.update