VB初心者です。
VB6+Access2000の環境下でプログラムを実行すると
「実行時エラー’3219’ このコンテキストで操作は許可されていません」とエラーになります。
下のプログラムの(2)の箇所でエラーになります。
(1)はエラーになりません。
つまり次のレコードに移動は問題ないのですが、前のレコードを表示
させようとするとエラーになります。
原因と解決方法をご教授ください。
-----------------------------------------------------------
プログラム
Private mCn As ADODB.Connection
Private mRs As ADODB.Recordset
---------------------------------
Private Sub Form_Load()
Set mCn = New ADODB.Connection
mCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\word.mdb"
mCn.Open
Set mRs = mCn.Execute("Select * From week_cel")
End Sub
---------------------------------
Private Sub Command1_Click()
’(1)
mRs.MovePrevious
If mRs.BOF Then
mRs.MoveFirst
End If
End Sub
--------------------------------
Private Sub Command2_Click()
’(2)
mRs.MoveNext
If mRs.EOF Then
mRs.MoveLast
End If
End Sub
載っている問題のソースは、コネクション/レコードセット共に
デフォルト値を使用しています。
よってadOpenForwardOnly(前方専用)を使用したカーソルです。
それを回避するか、カーソルをローカルに持ってきたらよいと思います。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=380932
方法は二つ
Private mCn As ADODB.Connection
Private mRs As ADODB.Recordset
Private Const DEF_CONNECT As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\word.mdb;"
Private Const DEF_SQL As String = "Select * From week_cel"
'※キーセット例
Private Sub ConnectKeyset()
Set mCn = New ADODB.Connection
mCn.ConnectionString = DEF_CONNECT
mCn.Open
Set mRs = New ADODB.Recordset
mRs.Open DEF_SQL, mCn, adOpenKeyset
End Sub
'※ユーザカーソル例
Private Sub ConnectUserCursor()
Set mCn = New ADODB.Connection
mCn.ConnectionString = DEF_CONNECT
mCn.Open
mCn.CursorLocation = adUseClient
Set mRs = mCn.Execute(DEF_SQL)
End Sub
>Private mRs As New ADODB.Recordset
が気になったので発言するデシ。
As New 宣言は、テスト的には使用しますが、実際のコーディングではお勧めできません、、、
set mCn = Nothing
と明示しても、アプリ起動中はnothingになりません。
MicroSoft(MSDN)にはAs Newサンプルを掲載しておりますが、多くのメーリングリストで、As Newは否定されております。
宣言にAs Newを使用するのは、コーディングに1行減るという以外、メリットは何もなく、むしろNothing状態を取得できないデメリットの方が大きいです。
こんばんわ。
>下のプログラムの(2)の箇所でエラーになります。
Private Sub Command2_Click()
これ→ mRs.MoveNext
If mRs.EOF Then
mRs.MoveLast
End If
End Sub
で、こけるんですよね。
単純に考えて、
レコードセットがすでにEOFなのに、
.MoveNextしようとしている場合があると思います。
ここで、こけているのでは?
その後に、カーソルを最後に持ってきているように見えます。
現状だと、レコードがEOFでエラーになるように思います。
Private Sub Command2_Click()
If mRs.EOF Then
mRs.MoveLast
Else
mRs.MoveNext
End If
End Sub
にしてみてはいかがですか?
たまたま、エラーがでていないかもしれませんが
レコードが0件だった場合。、(1)も(2)もこけると思います。
そんな場合はないのかもしれませんが>レコード0件の場合
はずしてたら、ごめんなさい。
お礼
ご回答ありがとうございました。 大変参考になりました。