ADOを使用してレコードを追加/更新する方法

このQ&Aのポイント
  • VC++ 6.0でAccess2000のレコードを追加/更新する方法がわかりません。webで調査しましたが、例外が発生します。
  • テーブルのNo、名前、カナなどのフィールドがあります。コーディングでは、Noの値を指定してレコードを選択し、AddNewメソッドを使用して新しいレコードを追加、Updateメソッドを使用して既存のレコードを更新しています。
  • しかし、実行するとAddNewメソッドとUpdateメソッドで例外が発生します(Unknown error 0x800A0BCD)。追加および更新の方法を教えてください。
回答を見る
  • ベストアンサー

ADOによるレコードの追加/更新

VC++ 6.0でAccess2000のレコードの追加/更新の方法がわかりません。 webで色々調べてそれらしく作りましたが、例外が発生します。 更新しようとするテーブルは、 No (数値型) 名前 (テキスト型) カナ (テキスト型) ・・・省略・・・ とあり、 コーディングは strwk.Format("%d",no); strSQL = "SELECT * FROM 住所録 WHERE No = " + strwk; varTName = _T(strSQL); pRs->Open( varTName, _variant_t((IDispatch *)pdb), adOpenDynamic, adLockOptimistic, adCmdUnknown); if (pRs->EndOfFile != FALSE){ vdata.intVal = no; pRs->AddNew("No", vdata); // 追加 } vdata.SetString(namae); hr = pRs->Update("名前", vdata); // 更新 としています。 実行するとAddNewメソッドとUpdateメソッドで例外が発生します。 (Unknown error 0x800A0BCD) 更新しようとするデータの内容は no = 2 name = "あい うえお" です。 追加及び更新の方法を教えてください。

  • kmor
  • お礼率90% (255/283)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>vdata.intVal = no; >ではいけないんでしょうか。 >型を変えるって具体的にどうするんでしょうか。 vdata.intVal = no; vdata.ChangeType(VT_I4); こんな感じ。 ようはコンストラクタで引数を指定していなかった場合は、VARTYPEはVT_EMPTYなので intValに直接値を入れるだけではだめということです。 もしくは、_variant_tなら代入演算子がオーバーロードされているので vdata = no; みたいに直接代入。 >また、更新でのUpDateはちゃんとできるんですが、追加でのAddNewの後のUpDateで例外が発生します。 >pfName->Value = vno; pfNameって何でしょう?どこから出てきたんですか?

kmor
質問者

お礼

ChangeTypeを使うとできました。 pfNameは、 FieldPtr pfNo, pfName; pfNo = pRs->Fields->GetItem("No"); pfName = pRs->Fields->GetItem("名前"); のようにレコードセットのフィールドを割り付けています。 ありがとうございました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

とりあえず、VARIANTは_variant_t型を使ってると仮定します。 >vdata.intVal = no; VARTYPEの指定が無いです。 _variant_t::ChangeType()で型を変えてください。 あとは、 >if (pRs->EndOfFile != FALSE){ ADO::EOFの型はVARIANT_BOOLです。 BOOLではありませんのでFALSEではなくVARIANT_FALSEを使いましょう。

kmor
質問者

補足

ありがとうございます。 >_variant_t::ChangeType()で型を変えてください。 とりあえず、Updateはうまく行ったんですが、 vdata.intVal = no; ではいけないんでしょうか。 型を変えるって具体的にどうするんでしょうか。 また、更新でのUpDateはちゃんとできるんですが、追加でのAddNewの後のUpDateで例外が発生します。 (IDispatch error #3105) if (pRs->EndOfFile == VARIANT_TRUE){  pRs->AddNew();  vno.intVal = no;  pfNo->Value = vno; } vno.Clear(); vno.SetString(namae); pfName->Value = vno; ・・・省略・・・ hr = pRs->Update(); これではだめなんでしょうか。 よろしくお願いします。

関連するQ&A

  • SQL文のWHERE句でエラー

    Access2000のMDBをADOで読み込もうとしていますが、WHERE句を指定すると例外が発生します。 strSQL = "SELECT * FROM Q住所録 ORDER BY [カナ]"; strWhere = "([カナ] Like \'ア*\')"; strSQL += " WHERE " + strWhere; ウォッチウィンドウでstrSQLを確認すると {"SELECT * FROM Q住所録 ORDER BY [カナ] WHERE ([カナ] Like 'ア*')"} とちゃんとなっていますが、 varTName = _T(strSQL); hr = pRs.CreateInstance( __uuidof( Recordset)); pRs->Open( varTName, _variant_t((IDispatch *)pdb), adOpenDynamic, adLockReadOnly, dCmdUnknown); でオープンすると例外が出ます。 エラーの内容は IDispatch error #3092 となっています。 WHRERE句をしていなければ全レコードがちゃんと表示されます。 WHERE句は使えないんでしょうか。 Filterプロパティの使い方もよくわかりません。 レコードの抽出の方法を教えてください。

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • ADOでエクセルからアクセスにデータを追加したいのですが、「CursorType」と「LockType」がどれが適切かわかりません。

    ADOでエクセルからアクセスにデータを追加したいだけなのですが 「CursorType」と「LockType」がどれが適切かわかりません。 CursorType 0 adOpenForwardOnly   レコードの前方スクロールだけが可能な静的カーソル。 (デフォルト) 1 adOpenKeyset 他のユーザによる変更データを参照可能。但し、追加データは参照できず、削除データにはアクセスできない。 2 adOpenDynamic 他のユーザーによる追加、変更、削除の操作が即座に反映される。 3 adOpenStatic レコード集合のコピーによる静的カーソル。前方、後方への移動が可能。 LockType 1 adLockReadOnly 読み取り専用。 2 adLockPessimistic レコード単位での排他的ロック。編集操作開始時にレコードをロックする。 3 adLockOptimistic レコード単位での共有的ロック。Updateメソッドを呼び出し時にレコードをロックする。 4 adLockBatchOptimistic 共有的バッチ更新。即時更新モードに対するバッチ更新モード。 ・エクセルもアクセスも使用しているのは自分ひとりです。 ・LockTypeについては Updateメソッドを使用してアクセスにデータを追加するため「adLockOptimistic」が適切かなと思うのですが CursorTypeの静的・動的がわからず判断できません。 ご教授よろしくお願いします。

  • MDBをADO接続でINSERT・UPDATE・DELETE

    VB2005.NETの初級開発者です。 MDBをADO接続で開発を行いたいのですが 記述の方法がわかりませんので教えて下さい。 下記のようなサンプルはネット上でもよく見るのですが INSERT分で記述を行いたいのですが、サンプルが見つかりません よろしくお願いします。 後、CurrentProject.Connection.Execute strSQL, , adCmdTex このような記述をネット上で見るのですがstrSQLにInsert分を 記述すれば良いのですか、わからないので教えて下さい。 また、下記の記述の方がよいのですか? Dim ct As New Connection() Dim rt As New Recordset() ' 接続文字列を設定 ct.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\test.mdb" ' データベースに接続 ct.Open() ' テーブルを指定し、レコードセットをオープン With rt .CursorType = CursorTypeEnum.adOpenDynamic .LockType = LockTypeEnum.adLockOptimistic .Open("Insert_Tbl", ct, , , CommandTypeEnum.adCmdTable) End With ' データを追加 With rt .AddNew() .Fields("aaa").Value = TextBox1.Text .Fields("bbb").Value = TextBox2.Text .Update() End With

  • ADOでのUPDATEメソッドについて

    ADOでのUPDATEメソッドについて いつもお世話になっております。 首題についてですが フォーム「携帯管理_F」を作成し、連結テキストボックスを 配置(全フィールド)してテーブル"t_携帯"が参照できるようにしています。 "t_携帯" [社員CD](重複あり) [氏名] [性別] [台数CD] フォーム上のコンボボックスを更新にした際に非連結テキストボックスinp_社員CD の中身をUPDATEメソッドにわたそうとしたのですが、 rs.Update "[社員CD]='" & Me!inp_社員CD & "'" にすると 「実行時エラー'3001'引数が間違った型、許容範囲外、または競合しています。」 と出てしまいます。 また、 rs.Fields("社員CD").Value = "' & Me!inp_社員CD & '" rs.Update とすると社員CDに「' & Me!inp_社員CD & '」が入ってしまいます。 どなたか良い更新の方法をご存知であればご教授願います。

  • SQLの同時実行

    SQL文について質問なんですが、下記のようなテーブルがあった場合に『2を3に、3を2にする』というクエリを作ってみましたが、どうもうまくいきません。 ┌─┬──┐ │No│項目│ ├-┼──┤ │1│ああ│ ├─┼──┤ │2│いい│ ├─┼──┤ │3│うう│ └─┴──┘ strSQL1=UPDATE テーブル名 SET No = '2' WHERE No = '3' strSQL2=UPDATE テーブル名 SET No = '3' WHERE No = '2' これをASPから実行する場合は cn.Execute(strSQL1) cn.Execute(strSQL2) とすると、先にstrSQL1が実行されテーブルが更新された後にstrSQL2が実行される ため、 ┌─┬──┐ │No│項目│ ├─┼──┤ │1│ああ│ ├─┼──┤ │3│いい│ ├─┼──┤ │3│うう│ └─┴──┘ となってしまいます。『2つの更新を同時に実行させる』もしくは『2つの更新クエリ1つにする』というようなことはできないものでしょうか?

  • Access2007 「レコードを追加できません」

    Access2007で困っております。 フォーム上からテキスト型のデータを入力しようとしても 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されうまく入りません。 【テーブル構成】 ★が主キー (1)T_アルバム ★アルバムID テキスト型 アルバム名 テキスト型 ジャンルID テキスト型 ソースID テキスト型 アーティストID テキスト型 (2)T_曲目 ★曲ID テキスト型 曲名 テキスト型 トラックNo テキスト型 アルバムID テキスト型 (3)MT_アーティスト ★アーティストID テキスト型 アーティスト名 テキスト型 (4)MT_ジャンル ★ジャンルID テキスト型 ジャンル名 テキスト型 (5)MT_ソース ★ソースID テキスト型 ソース名 テキスト型 【リレーション】 ※いずれも参照整合性付き (1)T_アルバム アルバムID --- (2)T_曲目 アルバムID (1)T_アルバム アーティストID --- (3)MT_アーティスト アーティストID (1)T_アルバム ジャンルID --- (4)MT_ジャンル ジャンルID (1)T_アルバム ソースID --- (5)MT_ソース ソースID フォーム作成のために「Q_アルバム情報入力」をつくりました。 アルバムID T_アルバム アルバム名 T_アルバム アーティストID MT_アーティスト アーティスト名 MT_アーティスト ジャンルID MT_ジャンル ジャンル名 MT_ジャンル ソースID MT_ソース ソース名 MT_ソース この「Q_アルバム情報入力」を使って、フォームウィザードからフォームを作成し、 アルバムIDやアルバム名を入力しようとすると 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されます。 他のフィールドは値が入力できますが、これら2つのフィールドのみ入力できません。 なお、各テーブルのフィールドには予めデータが入っている状態です。 宜しくお願い致します。

  • ハイパーリンクをADOで追加したい

    こんばんは。 テーブル1のハイパーリンク型のフィールドに テキストのアドレスを追加して、 クリックすると開くようにしたいのですがうまくいきません。 (エクセル→アクセス(2003)) Sub ハイパーリンクを追加() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\db1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs!番号 = 1 rs!リンク = "C:\Users\Desktop\test.txt" rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub これを実行すると 見た目としてはハイパーリンクが追加されたように見えるのですがクリックしても何も起こりません。 「ハイパーリンクの挿入」を確認してみると 表示文字列は C:\Users\Desktop\test.txt が入力されていますが アドレスは空欄です。 アドレスにも「"C:\Users\Desktop\test.txt"」を入れるにはどうすればいいのでしょうか? よろしくお願いします。

  • いちばん最後のレコードに値の追加ができません。

    ACCESSで、何週間も原因がどうしても解らず困っております。お助けください。 ある条件を基に複数のテーブルを参照しデータ加工を行った後に、レポート作成用テーブルのいちばん最後のレコードに必ず追加登録をしたいのですが、いちばん最後のレコードに登録できたり、既に登録されているレコードの間に割り込んで登録されたり処理の検証を行うたびに結果が異なるのです。 何度もデバッグを行いましたが、レポート作成用テーブルへUPDATEするまでの処理及びデータには間違いありません。レポート作成用テーブルで勝手にデータ入れ替わっているとしか思えないのですが・・・・・・ 最初はRecordsetオブジェクトはテーブルタイプを指定し、Addnew及びUpdateメソッドで追加登録していましたが、思うように動作しないためRecordsetオブジェクトをダイナセットタイプに変更してみましたが処理結果は変わりません。 ※RecordsetオブジェクトでIndexプロパティの設定はありません 参考書にダイナセットタイプのRecordsetオブジェクトは、設定されている並べ替え規則にかかわらず、必ずいちばん最後のレコードに追加されると記載されていたので試してみましたが駄目でした。 おおざっぱな説明で現状を理解して頂けるかわかりませんが宜しくお願いいたします。

  • Access2000 / 「レコードを追加できません」

    こんにちは Access2000で困っております。 簡単にいいますと、フォーム上から日付/時刻型のデータを入力しようとしても 「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されうまく入りません。 テーブルの構成ですが、 ★が主キー (1)T現場台帳 ★NO(オートナンバー型) 現場記号(テキスト型) ・ ・ 省略 (2)T外部集計警備 ★NO(オートナンバー型) 現場記号(テキスト型) 警備依頼日付(日付/時刻型) 警備会社ID(数値型) 集計人数(数値型) (3)T警備会社 ★警備会社ID 警備会社名(テキスト型) ・ ・ 省略 上記テーブルはリレーションがかかっており、 (1)T現場台帳.現場記号(テキスト型)----(2)T外部集計警備.現場記号(テキスト型) (2)T外部集計警備.警備会社ID(数値型)---(3)T警備会社.★警備会社ID それぞれ、参照整合性のついたリレーションです。 更にこれらをまとめるために、Q警備会社集計クエリ(選択クエリ)をつくりフォームに利用しています。 Q警備会社集計クエリの構成 T現場台帳.担当者ID T外部集計警備.警備依頼日付 T外部集計経緯日.警備会社ID T警備会社.警備会社名 T外部集計警備.集計人数 (並べ替えや絞込みは、なし) この「Q警備会社集計クエリ」を使って フォームからウイザードを使用してフォームを作成し、警備依頼日付を入力しようとすると「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されます。 どなたか、Accessの痒いところまで手の届く方、お助けください。

専門家に質問してみよう