C++BuilderでDAO

このQ&Aのポイント
  • C++Builder6でプログラミングを行い、Microsoft Accessのデータベースを扱っています。
  • CreateObjectを使用してデータベースへのデータ保存と取得を行いましたが、MovePreviousを使用するとエラーが発生します。
  • CreateObjectの使用方法についてのサイトや詳しい方の教授をお願いします。
回答を見る
  • ベストアンサー

C++BuilderでDAO

C++Builder6でプログラミングを行っています。 Microsoft Accessのデータベースを扱うには、CreateObjectを使用する事で容易に出来るというので、早速使用して開発を始めました。 データをデータベースへ保存して取得することは出来たし、カレントデータの次のデータは"MoveNext"で取得することができました。 しかし、ひとつ前のデータにアクセスしようとして"MovePrevious"を使用したら「無効な処理」というエラーになってしまいました。 もちろんデータはカレントレコードより前に存在します。 また、"MoveFirst"や"MoveLast"を使用してもエラーになります。 例) while ( !rs.Exec(PropertyGet("BOF"))){ ・・・ //前のレコード rs.Exec(Function("MovePrevious")); } C++BuilderのCreateObjectでMoveNext以外は使用できないのでしょうか? それとも、何か違う方法でひとつ前のレコードにアクセス方法がありますでしょうか? もし、CreateObjectの使用方法についてのサイトをご存知の方、 またはCreateObjectの使用に詳しい方がいらっしゃいましたらご教授の方よろしくお願い致します。

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

  • ベストアンサー
noname#86949
noname#86949
回答No.1

こんにちは。 1つ確認して下さい。 レコードセットは何タイプでオープンしていますか? ダイナセットタイプ?または前方スクロールタイプに なっていませんか? 良く似た経験がありますので・・・。

sanquu
質問者

お礼

Kinopio9さんありがとうございます!! 教えていただいたとおりでした。 本当に初心者の質問ですみませんでした。 解決しました!

関連するQ&A

  • エラー時の MsgBox の出し方

    VB5 WIN2000  です。 おはようございます。初心者の質問で申し訳ありませんが、宜しくご指導頂きたいと思います。 MsgBoxの質問です。顧客管理表を作っていますが、存在しない顧客番号等を検索をした時に 《実行時エラー'3021': カレントレコードがありません》 というエラーが出ます。これを、 MsgBoxで、「データーは存在しません。」という感じで表示できるようにするには、どのようなコードを書けばいいでしょうか? ちなみに今は、データを抽出できた時に rs.MoveNext If rs.EOF Then MsgBox "(^ω^)Already at end of recordset!" rs.MoveLast Exit Do End If Loop というメッセージを出すようにしてます。 これの後に続くコードとしては、どのような感じにすれば・・? BOFとかも考えたのですが、さっぱりうまく動きません・・。 どうかご指導宜しくお願いします。

  • ADOでループすると1レコードずつ飛ばしてしまう

    アクセスなのですが Sub test() Set cn = CurrentProject.Connection rs.Open "テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "(店名 = '" & str店名 & "') And (URL = '未')" For j = 1 To rs.RecordCount rs("URL") = "http" rs.Update rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub このようにして、既存のレコードにフィルタをかけて該当のレコードの値を更新しているのですが rs.MoveNext をいれると、 1レコード目、3レコード目、5レコード目・・・と言う順番になってしまい、 最終的にrs.RecordCountの数を越したレコードを指定してしまい 実行時エラー 3021 「BOFとEOFのいずれかTRUEになっていか、または現のレコードが要求された操作には、現在のレコードが必要です。」 となってしまいます。 だからって rs.MoveNextをいれないと、rs.RecordCountに達するまで、 いつまでも同じレコードをループしてしまいます。 1レコードずつ順番にデータを掴む方法を教えてください。

  • "カレントレコードがありません"とでてきます

    Access97を使用しています。 データは テーブルAの項目B、項目Cが下記のようにあるとします。 フォーム上のText"B"に項目Bを入力します。 項目B 項目C 11 a 11 b 22 aa 22 bb 22 cc 33 aaa 33 ccc この時 Set DB = CurrentDb() strSQL = "SELECT * FROM A WHERE " strSQL = strSQL + "B='" & Me.B & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) RS.MoveFirst RS.MoveLast m = RS.RecordCount For i = 1 To m COIL_N = RS.Fields("C") Call RS.MoveNext Next i 上記のようなモジュールですが、例えば 項目Bの"11"を選んだ時、項目Cの二番目のデータbが 取得できません。 "カレントレコードがありません"とでてきます。何故でしょうか?

  • カレント行取得

    Do While Not rs.EOF  If Text1(0).Text <> rs.Fields(1) Then   /*--*--*/   rs.MoveNext     Else   msg = "コードが重複しています."   MsgBox msg, vbOKOnly, "重複チェック"   Text1(0).Text = ""   Text1(0).SetFocus  End If Loop *------ text1(1) = rs.fields(1) text1(2) = rs.fields(2) -------* データベース(Access)にデータが3件入っていて、例えば、1件目のデータを更新したいのですが今のソースでは、/*--*--*/でデータベースを次々読んでいるので、3件読み終えたときにカレント行が4件目にあると思うので、それを”任意”の行にしたいのですが教えてください。

  • アクセスのフォームで10件づつ表示する。

    初めて書き込みさせて頂きます。 アクセスのテーブルを帳票形式にて作成して10件づつ表示をさせようとすると一部のデータが表示されません。 方法としては、帳票形式で10件のみ表示出来る様にサイズを調整して「前へ」と「次へ」のボタンをつけて10件づつ表示させています。 ソースは下記の方法で 「次へ」 Private Sub コマンド13_Click() Dim rs As DAO.Recordset, i As Integer Const n As Integer = 10 Set rs = Me.RecordsetClone For i = 1 To n * 2 If rs.EOF Then rs.MoveLast Me.Bookmark = rs.Bookmark Exit Sub End If rs.MoveNext Next Me.Bookmark = rs.Bookmark For i = 1 To n rs.MovePrevious Next Me.Bookmark = rs.Bookmark rs.Close End Sub 「前へ」 Private Sub コマンド16_Click() Dim rs As DAO.Recordset, i As Integer Const n As Integer = 10 Set rs = Me.RecordsetClone For i = 1 To n * 2 If rs.BOF Then rs.MoveFirst Me.Bookmark = rs.Bookmark Exit Sub End If rs.MovePrevious Next Me.Bookmark = rs.Bookmark For i = 1 To n rs.MoveNext Next Me.Bookmark = rs.Bookmark rs.Close End Sub 以上、ご教授の程宜しくお願い致します。

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • レコードセットのループ処理でエラー・・・

    簡単なことだと思うのですが、解決できなくこまっております。お助けください。 以下のコーディングで、データの取得は出来ているのですが、「Do Until rs1.EOF」でエラーとなります。 SOURCE----------------------------------------- sql = "Select No from t01" Recordset.Open sql, dbc, 3 If rs1.EOF Then Response.Write "データナシ<BR>" ←表示されません。 else Do Until rs1.EOF ←この行でエラーとなります。 Response.Write "No=" & rs1("No").Value rs1.MoveNext Loop end if Error-------------------------------------------- ADODB.Field (0x80020009) BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。 因みに、Do Untilを使用せず  Response.Write "No=" & rs1("No").Value  rs1.MoveNext  Response.Write "No=" & rs1("No").Value と記述すると正常にデータが表示されます。 「Do Until rs1.EOF」で発生するエラーの回避方法を御教示願います。

  • レコードの位置を指定するがうまくいきません

    よろしくお願い致します。 Access2007で、DAOを使用して以下の事を行っていますが、うまく動作しません。  一、rs.AddNewを12回繰り返してテーブルにレコードのみ作成しておく。     12回の意味は、縦に12項目分、横に時間フィールドを用意し、例えばA項目の10:00に     予定データが入っているイメージです。  二、他のテーブルから必要なデータを抽出し、rs.AbsolutePositionにデータ毎に     決まった位置を渡し、rs.Editで抽出データをセットしていきます。  三、全てのデータをセットし終えたら、フォームを表示し、そこに組み込んでいる     サブフォームにデータが所定の位置にキレイ並んでいる状態です。 エラーなく処理はされるのですが、フォームが表示されると実際の抽出データを違う位置に 予定が入っています。時間を表すフィールドは合っているので、AbsolutePositionに正しく 値が渡されていないのかなと思うのですが、順にコードをなめていくと入っているように 思います。コードは以下の通りです。 Do rsYotei.EOF Set rs = db.OpenRecordset("12レコードあるテーブル") rs.MoveLast rs.AbsolutePosition="入れたいレコードの位置" rs.Edit rs.Fields("入れたい時間").Value="予定データ" rs.Update rs.Close:Set rs=Nothing rsYotei.MoveNext Loop 以上です。 どなたかお知恵を拝借できれば幸いです。 よろしくお願い致します。

  • VB6の複数検索条件で連続検索が出来ないので教えて下さい

    下記のごとく、ADOデーターベースの複数アンド条件で検索をしているのですが、一番最初のレコードは検索されるのですが、次の検索をしようと思い、rs.movenextを実行しても次のレコードに飛んで検索をしてくれません。たった一度のみの検索となります。 連続検索を行いたいのですが分かりません。 どなたか、詳しい方がおられましたら宜しくお願い致します。 Public Sub Multi_find(ByRef oRs As ADODB.Recordset, sCriteria As String) Dim clone_rs As ADODB.Recordset Set clone_rs = oRs.Clone clone_rs.Filter = sCriteria If clone_rs.EOF Or clone_rs.BOF Then oRs.MoveLast oRs.MoveNext Else oRs.Bookmark = clone_rs.Bookmark End If clone_rs.Close Set clone_rs = Nothing End Sub

  • AccessのDAOでフィールド名を配列に格納して・・・

    Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。 Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable) Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable) Do Until Rs1.EOF Rs2.AddNew Rs2!FL1 = Rs1!名前 Rs2!FL2= Rs1!性別 Rs2!FL3= Rs1!郵便番号 Rs2!FL4= Rs1!住所    ・    ・ Rs2! FL50= Rs1! 50番目 Rs2.Update Rs1.MoveNext Loop 複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。 Dim I Dim FieldsName FieldsName=Array("名前","性別",・・・"50番目")            ・            ・ Do Until Rs1.EOF Rs2.AddNew For I=0 To 49 Rs2!フィールド(I) = Rs1!FieldsName(I) Next Rs2.Update Rs1.MoveNext Loop じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。 For I=0 To 49 Rs2!フィールド(I) = Rs1!Td.Fields(I).Name Next やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。

専門家に質問してみよう