データベース操作時エラーについて

このQ&Aのポイント
  • VB初心者でもわかる!データベース操作時のエラーを解決する方法とは?
  • VB6+Access2000の環境下でプログラムを実行する際に「実行時エラー’3219’ このコンテキストで操作は許可されていません」というエラーが発生します。特に(2)の箇所でエラーが発生する現象が報告されています。このエラーの原因や解決方法について詳しく解説します。
  • データベース操作時に発生するエラーについて知りたい方必見!VB初心者でもわかるように、具体的なプログラムの箇所やエラーメッセージを紹介しながら、エラーの原因や解決方法について解説します。必ず役立つ情報が得られるはずです。
回答を見る
  • ベストアンサー

データベース操作時エラーについて

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   

  • gorou
  • お礼率45% (83/184)

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

載っている問題のソースは、コネクション/レコードセット共に デフォルト値を使用しています。 よって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
gorou
質問者

お礼

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

その他の回答 (4)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

>Private mRs As New ADODB.Recordset が気になったので発言するデシ。 As New 宣言は、テスト的には使用しますが、実際のコーディングではお勧めできません、、、 set mCn = Nothing と明示しても、アプリ起動中はnothingになりません。 MicroSoft(MSDN)にはAs Newサンプルを掲載しておりますが、多くのメーリングリストで、As Newは否定されております。 宣言にAs Newを使用するのは、コーディングに1行減るという以外、メリットは何もなく、むしろNothing状態を取得できないデメリットの方が大きいです。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

エラー問題はgoogleとMSで検索してみましょう。 例えば、参考URLによると mCn.CursorLocation = adUseClient とか

参考URL:
http://www.galliver.co.jp/book/vb300nd/supplement.html
  • k_kazari
  • ベストアンサー率68% (15/22)
回答No.3

ダメでしたか・・・ごめんなさい。 夜中に頑張ってますね!お疲れ様です。 ちなみに、 Private mRs As New ADODB.Recordset でもダメ? ( New を追加 ) 自分がADOでDB操作した時のコード見てみましたが これぐらいしか、思いつきません。 う~~~ん。ダメかなぁ・・・ う~~~ん。ボタンイベントでこけるって事は これもダメかな・・・ ダメならごめんなさい

  • k_kazari
  • ベストアンサー率68% (15/22)
回答No.2

こんばんわ。 >下のプログラムの(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件の場合 はずしてたら、ごめんなさい。

gorou
質問者

お礼

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

関連するQ&A

  • データベースを切り替えて使う方法

    初心者です。 環境:WindowsXP,VB6,Access2000 Access2000のデータベースを切り替えて使いたいのですが、うまく動作しません。 ADO使用しています。 普通に考えて、いったんつないでいたDBを mRs.Close mCn.Close Set mRs = Nothing Set mCn = Nothing で接続をいったん切断して、 Call ConnectType で再度DBに接続しましたが、接続されているのは前のDBです。 1 原因がわかりません。 2 DBを切り替えて使う方法がわかりません。 もちろん切り替えの処理以外は現在正常に動作しています。 ご教授よろしくお願いいたします。 <プログラム> Private mCn As ADODB.Connection Private mRs As ADODB.Recordset Private DBfile As String Private Const DEF_CONNECT As String     = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\word.mdb" Private Const DEF_SQL As String = "Select * From tango_tbl" Private Sub ConnectType() Set mCn = New ADODB.Connection mCn.ConnectionString = DEF_CONNECT mCn.Open Set mRs = New ADODB.Recordset mRs.Source = DBfile mRs.ActiveConnection = mCn mRs.CursorType = adOpenDynamic mRs.LockType = adLockOptimistic mRs.Open End Sub

  • AccessでのROLLBACKについて

    動作環境:VB6+Access2000 ADOを使ってVBからAccessのデータベースに接続しています。 COMMITとROLLBACKの機能を追加しようと思い下記プログラムの (1)から(6)を追加して実行すると(1)のところで 「メソッドがみつかりません」というエラーになります。 (1)から(6)を追加するまでは正常に動作しています。 本を参考に(1)から(6)を追加しました。 ようするに「BeginTrans」のメソッドが使えないのでしょうが、 対策を教えて頂くと助かります。 (別にコーディングは別の書き方でもいいですが、ADOは使います) よろしくお願いします。 ------------------------------------------------ プログラム Private Sub ConnectType()  Set mCn = New ADODB.Connection  mCn.ConnectionString = DEF_CONNECT & AppPath & "\" & DBfile  mCn.Open  Set mRs = New ADODB.Recordset  If Text8.Text <> "" Then   mRs.BeginTrans '(1)   mRs.Source = Text8.Text   mRs.ActiveConnection = mCn   mRs.CursorType = adOpenDynamic   mRs.LockType = adLockOptimistic   mRs.Open   If MsgBox("変更を保存しますか?", vbYesNo) = vbYes Then '(2)    mRs.CommitTrans '(3)   Else '(4)    mRs.Rollback '(5)   End If '(6) End If  Debug.Print Text8.Text End Sub

  • SQLでの処理

    開発環境:WindowsXP、VB6、Access2000 ADO接続前提 ファイル全体のデータ(全レコード)に対して連続して処理するにはSQLで対応するのがいいのだと思いますが やりかたがわかりません。 たとえば、つぎのようなAccessのファイルがあったとします。 ファイル名:kojin.mdb テーブル名:name_tbl 名前 年齢 性別   太郎 20 M    花子 40 F 三郎 30 M 洋子 50 F 質問1 年齢順にレコードを並べかえる。 質問2 性別のFをWに一括変換する。 なお、SQLの文法を質問しているのではありません。 下のプログラム1でレコード表示を行ってます。 また、省略しますが、次のレコードや前のレコードを表示したり、レコードの更新・追加・削除などを行うこともできています。 これからどうすればSQL文を使って質問1や2の処理が可能になるのでしょうか? ご教授お願いしたします。 <プログラム1> Private mCn As ADODB.Connection Private mRs As ADODB.Recordset Private DBfile As String 'DBファイル名 Private DBtable As String 'テーブル名 Private Sub Form_Load()  DBfile = "kojin.mdb"  DBtable = "name_tbl"  Call ConnectType  Call SetFields End Sub Private Sub ConnectType() 'DB接続準備処理   Set mCn = New ADODB.Connection   mCn.ConnectionString = DEF_CONNECT & App.Path & "\" & DBfile   mCn.Open   Set mRs = New ADODB.Recordset   mRs.Source = DBtable   mRs.ActiveConnection = mCn   mRs.CursorType = adOpenDynamic   mRs.LockType = adLockOptimistic   mRs.Open End Sub Private Sub SetFields()  Text1.Text = mRs.Fields("名前")  Text2.Text = mRs.Fields("年齢i")  Text3.Text = mRs.Fields("性別") End Sub

  • 途中でエラーが出てしまい手が止まってしまいました(T_T)

    Visual Basicについてなんですが、いいですか? http://azsx00.tripod.co.jp/D001.jpg 初心者じみた質問ですみません。 上記の画像ののようなプログラムが途中までで引っかかってしまって先に進めません。 どなたかご指導下さい。 一応自分で考えた結果です。どこが悪いとか何が分かってないとかいろいろアドバイスもあればお願いします。まだ習い始めたばかりです。 Dim Number As Integer Dim Score As Integer Dim MessageText As String Private Sub Command1_Click() If Number > 7 Then Score = Score + 1 MessageText "あたり" End If If Number < 7 Then Score = Score - 1 MessageText "外れ" End If If Number = 7 Then Score = Score + 0 MessageText "引き分け" End If End Sub Private Sub Command2_Click() If Number > 7 Then Score = Score + 1 MessageText "あたり" End If If Number < 7 Then Score = Score - 1 MessageText "外れ" End If If Number = 7 Then Score = Score + 0 MessageText "引き分け" End If End Sub Private Sub Form_Load() Number = Rnd() * 13 + 1 Score = 0 Label1.Caption = "?" Text1.Text = "Score:" & Score End Sub Private Sub Label1_Click() If Number > 7 Then Label1.Caption = "Score" End If If Number < 7 Then Label1.Caption = "Score" End If End Sub

  • ADODBのRecordset.Deleteのエラーについて誰か助けてください!!

    データベースはAccess2000 プロバイダはJet4.0です。 (1)まずレコードがない状態でレコードを追加します。 (2)そのまま削除ボタンを押します。 (3)エラーが発生します。 「行が見つからなかったため更新できません。列の値は最後に読み込   まれた後で変更された可能性があります。」 (4)終了し起動します。 (5)なぜかレコードが1件あります。(削除が失敗?) (6)削除します。メッセージボックスがでて削除成功します。  このときレコードはありません。(データグリッド上) (7)レコードを追加します。成功します。 (8)削除するとデータグリッド上ではレコードがあるのに  メッセージボックスが出て追加を促してきます。 (9)追加して削除するとまたメッセージボックスが出てきます。  このときデータグリッド上のレコードは増えています。  (8)~(9)が繰り返しおきます。 その後vbを終了させてAccessで内容を確認するとレコードが増えていますが、 顧客IDフィールドの増加処理がされていなくすべて1になっています。 Update,Addnew,Deleteメソッドの理解が不十分なのか、カーソルの位置 の理解不足なのかわかりません。 どなたか手を貸してください。 Private Sub cmdDelete_Click() If Rs.RecordCount = 0 Then MsgBox "レコードがありません。追加してください。", vbOKOnly Exit Sub End If Rs.Delete If Rs.RecordCount = 0 Then MsgBox "レコードがありません。追加してください。", vbOKOnly Exit Sub End If Rs.MoveNext If Rs.EOF Then Rs.MoveLast End If End Sub Private Sub cmdNew_Click() Rs.AddNew "顧客ID", "増加する処理済" End Sub Private Sub cmdUpdate_Click() Rs.Update End Sub

  • 実行時エラー13について

    データベースにアクセス2000を使用し、VBからアクセスのデータを抽出しようと言う、簡単なプログラムを作成しました。 そして私のPCではデータがちゃんと抽出されるのですが、他のPCで実行しますと、実行時エラー13となってしまいます。 ソースは以下のように記述いたしました。 Private Sub Command1_Click() Dim objCon As ADODB.Connection Dim objRec As ADODB.Recordset Set objCon = CreateObject("ADODB.Connection") objCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb;" Set objRec = objCon.Execute("SELECT komoku2 FROM test WHERE komoku1 = 1") Text1.Text = objRec.Fields("komoku2").Value objCon.Close Set objCon = Nothing End Sub 尚、他のPCに最新のランタイムをインストールしてみましたが、現象は変わらずです。。。 現象を確かめるべく、他のPCにVBをインストールしたいのですが、個人的に作ったプログラムの為に他人のPCにVBをインストールする事が出来ないので、デバックが行えない状況です。 私のPCの環境は Win2000Pro-SP2 VB6.0-SP5 他のPC(2台) ・WinNT-SP4 ・Win98 上記2台とも、ランタイムだけは最新です。

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

  • ListViewから選択中の文字列を取得

    VB2005の初心者です。 タイトル通り、ListViewから選択中の文字列によって処理を変えるプログラムを構築しようとしているのですが、うまくいきません。 ComboBoxの場合では Private Sub button1_Click~ If ComboBox1.SelectedItem = "テスト" Then 処理 End if でうまくいったのですが、ListViewの場合では Private Sub button1_Click~ If ListView1.SelectedItems = "テスト" Then 処理 End if と指定すると 「エラー 1 これらの引数で呼び出される、アクセス可能な '=' がないため、オーバーロードの解決に失敗しました」 とエラーがでます。 ListViewから選択中の文字列を取得するには「.SelectedItems」では取得できないのでしょうか? VBに詳しい方ご教授お願いします。

  • ビジュアルベーシックのお絵かき掲示板

    まったくの初心者です。初歩的な質問で申し訳ありません。 カラーのところでクリックが実行できません。 なぜなのかよくわかりません。お暇なときご教授下さい。  そしてもう一つ質問ですが以下のコードを追加したいの ですがどこに挿入すればいいのですか。 →private sub image_click() ccolor = 7 end sub ここまでのコードを追加したいです。 ーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Command1_Click() Form1.Cls End Sub Private Sub Command2_Click() End End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Form1.DrawWidth = 3 If Button = 1 Then PSet (X, Y), QBColor(ccolor) End If End Sub Private Sub Label1_Click() cccolor = 14 End Sub Private Sub lavel2_click() cccolor = 0 End Sub Private Sub label3_click() ccolor = 9 End Sub Private Sub label4_click() ccolor = 12 End Sub Private Sub label5_click() ccolor = 10 End Sub

  • 12個のCommandbuttonをスマートに

    はじめまして 2003 XP UserFormにCommandbuttonが12個あります。 Private Sub CommandButton1_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "1" Else: TextBox1.Value = TextBox1 & "1" End If End Sub Private Sub CommandButton2_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "2" Else: TextBox1.Value = TextBox1 & "2" End If End Sub Private Sub CommandButton3_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "3" Else: TextBox1.Value = TextBox1 & "3" End If End Sub Private Sub CommandButton4_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "4" Else: TextBox1.Value = TextBox1 & "4" End If End Sub Private Sub CommandButton5_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "5" Else: TextBox1.Value = TextBox1 & "5" End If End Sub Private Sub CommandButton6_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "6" Else: TextBox1.Value = TextBox1 & "6" End If End Sub Private Sub CommandButton7_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "7" Else: TextBox1.Value = TextBox1 & "7" End If End Sub Private Sub CommandButton8_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "8" Else: TextBox1.Value = TextBox1 & "8" End If End Sub Private Sub CommandButton9_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "9" Else: TextBox1.Value = TextBox1 & "9" End If End Sub Private Sub CommandButton10_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "0" Else: TextBox1.Value = TextBox1 & "0" End If End Sub Private Sub CommandButton11_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "00" Else: TextBox1.Value = TextBox1 & "00" End If End Sub Private Sub CommandButton12_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "000" Else: TextBox1.Value = TextBox1 & "000" End If End Sub  これをもっとスマートに出来ないでしょうか? 宜しくお願いします。

専門家に質問してみよう