新生活!引っ越してから困らないように注意すべきことは?>>

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

  

gooドクター

A 回答 (5件)

載っている問題のソースは、コネクション/レコードセット共に


デフォルト値を使用しています。
よって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

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=380932
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
大変参考になりました。

お礼日時:2003/03/18 02:41

>Private mRs As New ADODB.Recordset


が気になったので発言するデシ。

As New 宣言は、テスト的には使用しますが、実際のコーディングではお勧めできません、、、

set mCn = Nothing
と明示しても、アプリ起動中はnothingになりません。

MicroSoft(MSDN)にはAs Newサンプルを掲載しておりますが、多くのメーリングリストで、As Newは否定されております。

宣言にAs Newを使用するのは、コーディングに1行減るという以外、メリットは何もなく、むしろNothing状態を取得できないデメリットの方が大きいです。
    • good
    • 0

エラー問題はgoogleとMSで検索してみましょう。


例えば、参考URLによると
mCn.CursorLocation = adUseClient
とか

参考URL:http://www.galliver.co.jp/book/vb300nd/supplemen …
    • good
    • 0

ダメでしたか・・・ごめんなさい。


夜中に頑張ってますね!お疲れ様です。

ちなみに、
Private mRs As New ADODB.Recordset
でもダメ?
( New を追加 )
自分がADOでDB操作した時のコード見てみましたが
これぐらいしか、思いつきません。

う~~~ん。ダメかなぁ・・・
う~~~ん。ボタンイベントでこけるって事は
これもダメかな・・・

ダメならごめんなさい
    • good
    • 0

こんばんわ。



>下のプログラムの(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件の場合

はずしてたら、ごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
残念ながらうまく動作しませんでした。
もうすこしがんばってみます。

お礼日時:2003/03/18 02:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング